{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "400ae922",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T06:40:50.974642Z",
     "start_time": "2024-06-06T06:40:49.958824Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\miniconda3\\envs\\cnn\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "from InceptionV3 import inceptionV3\n",
    "import torch\n",
    "import torchvision\n",
    "import torch.nn as nn\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import torch.optim as optim\n",
    "from torch.utils.data import DataLoader\n",
    "import torchvision.datasets as datasets\n",
    "import torchvision.transforms as transforms\n",
    "from torchvision.transforms.functional import InterpolationMode\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1f453e31",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T06:40:51.067037Z",
     "start_time": "2024-06-06T06:40:50.976642Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "InceptionV3(\n",
       "  (Conv2d_1a_3x3): BasicConv2D(\n",
       "    (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (relu): ReLU(inplace=True)\n",
       "  )\n",
       "  (Conv2d_2a_3x3): BasicConv2D(\n",
       "    (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (relu): ReLU(inplace=True)\n",
       "  )\n",
       "  (Conv2d_2b_3x3): BasicConv2D(\n",
       "    (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (relu): ReLU(inplace=True)\n",
       "  )\n",
       "  (Conv2d_3b_1x1): BasicConv2D(\n",
       "    (conv): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1))\n",
       "    (bn): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (relu): ReLU(inplace=True)\n",
       "  )\n",
       "  (Conv2d_4a_3x3): BasicConv2D(\n",
       "    (conv): Conv2d(80, 192, kernel_size=(3, 3), stride=(1, 1))\n",
       "    (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (relu): ReLU(inplace=True)\n",
       "  )\n",
       "  (Mixed_5b): InceptionA(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch5x5): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch3x3): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(192, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_5c): InceptionA(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch5x5): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(256, 48, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch3x3): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(256, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_5d): InceptionA(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch5x5): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch3x3): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(288, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_6a): InceptionB(\n",
       "    (branch3x3): BasicConv2D(\n",
       "      (conv): Conv2d(288, 384, kernel_size=(3, 3), stride=(2, 2))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2))\n",
       "        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (Mixed_6b): InceptionC(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch7x7): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(128, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch7x7stack): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (3): BasicConv2D(\n",
       "        (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (4): BasicConv2D(\n",
       "        (conv): Conv2d(128, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_6c): InceptionC(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch7x7): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch7x7stack): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (3): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (4): BasicConv2D(\n",
       "        (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_6d): InceptionC(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch7x7): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch7x7stack): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (3): BasicConv2D(\n",
       "        (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (4): BasicConv2D(\n",
       "        (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_6e): InceptionC(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch7x7): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch7x7stack): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (3): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (4): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (Mixed_7a): InceptionD(\n",
       "    (branch3x3): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(192, 320, kernel_size=(3, 3), stride=(2, 2))\n",
       "        (bn): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch7x7): Sequential(\n",
       "      (0): BasicConv2D(\n",
       "        (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (2): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "      (3): BasicConv2D(\n",
       "        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch_pool): AvgPool2d(kernel_size=3, stride=2, padding=0)\n",
       "  )\n",
       "  (Mixed_7b): InceptionE(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(1280, 320, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(1280, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch3x3_1): BasicConv2D(\n",
       "      (conv): Conv2d(1280, 384, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3_2a): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3_2b): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_1): BasicConv2D(\n",
       "      (conv): Conv2d(1280, 448, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(448, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_2): BasicConv2D(\n",
       "      (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_3a): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_3b): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (Mixed_7c): InceptionE(\n",
       "    (branch1x1): BasicConv2D(\n",
       "      (conv): Conv2d(2048, 320, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch_pool): Sequential(\n",
       "      (0): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "      (1): BasicConv2D(\n",
       "        (conv): Conv2d(2048, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "        (bn): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "        (relu): ReLU(inplace=True)\n",
       "      )\n",
       "    )\n",
       "    (branch3x3_1): BasicConv2D(\n",
       "      (conv): Conv2d(2048, 384, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3_2a): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3_2b): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_1): BasicConv2D(\n",
       "      (conv): Conv2d(2048, 448, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (bn): BatchNorm2d(448, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_2): BasicConv2D(\n",
       "      (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_3a): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (branch3x3stack_3b): BasicConv2D(\n",
       "      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0))\n",
       "      (bn): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (avgpool): AdaptiveMaxPool2d(output_size=(1, 1))\n",
       "  (dropout): Dropout2d(p=0.5, inplace=False)\n",
       "  (linear): Linear(in_features=2048, out_features=100, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = inceptionV3()\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0995ed11",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T06:40:51.083078Z",
     "start_time": "2024-06-06T06:40:51.068038Z"
    }
   },
   "outputs": [],
   "source": [
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.247, 0.2435, 0.2616]),\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4cd89535",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T06:40:52.107425Z",
     "start_time": "2024-06-06T06:40:51.083581Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "train_dataset = datasets.CIFAR100(root='../data', train=True, transform=transform, download=True)\n",
    "test_dataset = datasets.CIFAR100(root='../data', train=False, transform=transform, download=True)\n",
    "\n",
    "train_loader = DataLoader(dataset=train_dataset, batch_size=256, shuffle=True)\n",
    "test_loader = DataLoader(dataset=test_dataset, batch_size=256, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5af2fe25",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T06:40:52.344809Z",
     "start_time": "2024-06-06T06:40:52.108427Z"
    }
   },
   "outputs": [],
   "source": [
    "model = inceptionV3().cuda()\n",
    "criterion = nn.CrossEntropyLoss().cuda()\n",
    "optimizer = optim.SGD(model.parameters(), lr=1e-2, momentum=0.9, weight_decay=5e-4)\n",
    "\n",
    "num_epochs = 100\n",
    "train_loss, train_acc, test_loss, test_acc = [], [], [], []\n",
    "best_val_loss = float('inf')\n",
    "save_path = './AlexNet.pth'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5fd11940",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:40:27.273511Z",
     "start_time": "2024-06-06T06:40:52.345809Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|                                                                                          | 0/100 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1|100, Train Loss:5.3164, Train Acc:1.20%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  1%|▊                                                                              | 1/100 [01:49<3:00:42, 109.52s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1|100, Test Loss:16.1318, Test Acc:1.48%\n",
      "Epoch 2|100, Train Loss:5.2229, Train Acc:1.57%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  2%|█▌                                                                             | 2/100 [03:37<2:57:30, 108.68s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 2|100, Test Loss:5.7078, Test Acc:1.92%\n",
      "Epoch 3|100, Train Loss:5.1768, Train Acc:1.91%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  3%|██▎                                                                            | 3/100 [05:27<2:56:38, 109.26s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 3|100, Test Loss:11.6610, Test Acc:1.66%\n",
      "Epoch 4|100, Train Loss:5.1109, Train Acc:2.18%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  4%|███▏                                                                           | 4/100 [07:17<2:55:30, 109.69s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 4|100, Test Loss:5.1080, Test Acc:3.01%\n",
      "Epoch 5|100, Train Loss:5.0646, Train Acc:2.60%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  5%|███▉                                                                           | 5/100 [09:07<2:53:31, 109.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 5|100, Test Loss:5.1479, Test Acc:3.25%\n",
      "Epoch 6|100, Train Loss:4.9520, Train Acc:3.61%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  6%|████▋                                                                          | 6/100 [10:57<2:51:59, 109.78s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 6|100, Test Loss:5.4707, Test Acc:3.54%\n",
      "Epoch 7|100, Train Loss:4.8983, Train Acc:4.76%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  7%|█████▌                                                                         | 7/100 [12:48<2:50:32, 110.03s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 7|100, Test Loss:49.3611, Test Acc:4.04%\n",
      "Epoch 8|100, Train Loss:4.8323, Train Acc:5.31%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  8%|██████▎                                                                        | 8/100 [14:38<2:48:49, 110.10s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 8|100, Test Loss:4.3463, Test Acc:6.77%\n",
      "Epoch 9|100, Train Loss:4.4371, Train Acc:7.33%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  9%|███████                                                                        | 9/100 [16:29<2:47:26, 110.40s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 9|100, Test Loss:4.3182, Test Acc:8.38%\n",
      "Epoch 10|100, Train Loss:4.3480, Train Acc:8.98%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 10%|███████▊                                                                      | 10/100 [18:23<2:47:30, 111.67s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 10|100, Test Loss:737.4813, Test Acc:5.05%\n",
      "Epoch 11|100, Train Loss:4.2805, Train Acc:9.42%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 11%|████████▌                                                                     | 11/100 [20:15<2:45:30, 111.58s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 11|100, Test Loss:3.9045, Test Acc:13.04%\n",
      "Epoch 12|100, Train Loss:4.0495, Train Acc:12.82%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 12%|█████████▎                                                                    | 12/100 [22:05<2:43:15, 111.32s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 12|100, Test Loss:3.8081, Test Acc:15.63%\n",
      "Epoch 13|100, Train Loss:3.9840, Train Acc:14.66%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 13%|██████████▏                                                                   | 13/100 [23:57<2:41:24, 111.32s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 13|100, Test Loss:3.6714, Test Acc:17.15%\n",
      "Epoch 14|100, Train Loss:3.8757, Train Acc:16.40%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 14%|██████████▉                                                                   | 14/100 [25:48<2:39:29, 111.27s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 14|100, Test Loss:4.3720, Test Acc:17.16%\n",
      "Epoch 15|100, Train Loss:3.8425, Train Acc:17.91%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 15%|███████████▋                                                                  | 15/100 [27:39<2:37:25, 111.13s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 15|100, Test Loss:20.7485, Test Acc:19.43%\n",
      "Epoch 16|100, Train Loss:3.7451, Train Acc:19.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 16%|████████████▍                                                                 | 16/100 [29:30<2:35:48, 111.29s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 16|100, Test Loss:3.2844, Test Acc:22.54%\n",
      "Epoch 17|100, Train Loss:3.6109, Train Acc:21.66%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 17%|█████████████▎                                                                | 17/100 [31:22<2:33:55, 111.27s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 17|100, Test Loss:3.2088, Test Acc:23.18%\n",
      "Epoch 18|100, Train Loss:3.5404, Train Acc:23.30%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 18%|██████████████                                                                | 18/100 [33:13<2:32:10, 111.34s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 18|100, Test Loss:3.1923, Test Acc:27.14%\n",
      "Epoch 19|100, Train Loss:3.3868, Train Acc:25.26%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 19%|██████████████▊                                                               | 19/100 [35:04<2:30:17, 111.32s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 19|100, Test Loss:3.2981, Test Acc:28.11%\n",
      "Epoch 20|100, Train Loss:3.2411, Train Acc:27.43%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 20%|███████████████▌                                                              | 20/100 [36:54<2:27:35, 110.69s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 20|100, Test Loss:3.6478, Test Acc:29.69%\n",
      "Epoch 21|100, Train Loss:3.1536, Train Acc:29.31%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 21%|████████████████▍                                                             | 21/100 [38:43<2:25:08, 110.23s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 21|100, Test Loss:3.0412, Test Acc:31.13%\n",
      "Epoch 22|100, Train Loss:3.1020, Train Acc:30.44%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 22%|█████████████████▏                                                            | 22/100 [40:30<2:21:59, 109.22s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 22|100, Test Loss:3.1118, Test Acc:32.60%\n",
      "Epoch 23|100, Train Loss:3.0057, Train Acc:32.58%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 23%|█████████████████▉                                                            | 23/100 [42:17<2:19:18, 108.55s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 23|100, Test Loss:3.2261, Test Acc:33.96%\n",
      "Epoch 24|100, Train Loss:2.8376, Train Acc:34.38%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 24%|██████████████████▋                                                           | 24/100 [44:03<2:16:36, 107.85s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 24|100, Test Loss:16.9624, Test Acc:34.66%\n",
      "Epoch 25|100, Train Loss:2.7886, Train Acc:36.58%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 25%|███████████████████▌                                                          | 25/100 [45:50<2:14:38, 107.71s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 25|100, Test Loss:3.0455, Test Acc:37.23%\n",
      "Epoch 26|100, Train Loss:2.6578, Train Acc:38.53%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 26%|████████████████████▎                                                         | 26/100 [47:37<2:12:19, 107.29s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 26|100, Test Loss:5.7092, Test Acc:35.44%\n",
      "Epoch 27|100, Train Loss:2.5795, Train Acc:40.38%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 27%|█████████████████████                                                         | 27/100 [49:24<2:10:26, 107.21s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 27|100, Test Loss:2.8015, Test Acc:39.93%\n",
      "Epoch 28|100, Train Loss:2.4129, Train Acc:42.73%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 28%|█████████████████████▊                                                        | 28/100 [51:10<2:08:25, 107.02s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 28|100, Test Loss:2.5583, Test Acc:40.35%\n",
      "Epoch 29|100, Train Loss:2.3451, Train Acc:44.75%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 29%|██████████████████████▌                                                       | 29/100 [52:57<2:06:25, 106.84s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 29|100, Test Loss:2.4598, Test Acc:42.02%\n",
      "Epoch 30|100, Train Loss:2.2029, Train Acc:46.80%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 30%|███████████████████████▍                                                      | 30/100 [54:43<2:04:36, 106.81s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 30|100, Test Loss:3.8871, Test Acc:42.42%\n",
      "Epoch 31|100, Train Loss:2.0791, Train Acc:49.32%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 31%|████████████████████████▏                                                     | 31/100 [56:30<2:02:48, 106.79s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 31|100, Test Loss:4.1846, Test Acc:42.82%\n",
      "Epoch 32|100, Train Loss:2.1223, Train Acc:48.58%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 32%|████████████████████████▉                                                     | 32/100 [58:18<2:01:20, 107.07s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 32|100, Test Loss:2.2148, Test Acc:43.58%\n",
      "Epoch 33|100, Train Loss:2.0332, Train Acc:49.46%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 33%|█████████████████████████                                                   | 33/100 [1:00:06<1:59:47, 107.27s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 33|100, Test Loss:7.0749, Test Acc:42.41%\n",
      "Epoch 34|100, Train Loss:1.8662, Train Acc:51.95%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 34%|█████████████████████████▊                                                  | 34/100 [1:01:54<1:58:18, 107.55s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 34|100, Test Loss:2.8765, Test Acc:38.70%\n",
      "Epoch 35|100, Train Loss:1.8522, Train Acc:52.98%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 35%|██████████████████████████▌                                                 | 35/100 [1:03:40<1:56:09, 107.22s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 35|100, Test Loss:2.5485, Test Acc:43.59%\n",
      "Epoch 36|100, Train Loss:1.7264, Train Acc:55.47%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 36%|███████████████████████████▎                                                | 36/100 [1:05:26<1:54:02, 106.92s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 36|100, Test Loss:2.2518, Test Acc:46.48%\n",
      "Epoch 37|100, Train Loss:1.4871, Train Acc:59.83%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 37%|████████████████████████████                                                | 37/100 [1:07:12<1:51:51, 106.54s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 37|100, Test Loss:2.7390, Test Acc:44.07%\n",
      "Epoch 38|100, Train Loss:1.5410, Train Acc:60.00%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 38%|████████████████████████████▉                                               | 38/100 [1:08:59<1:50:09, 106.60s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 38|100, Test Loss:2.8571, Test Acc:44.53%\n",
      "Epoch 39|100, Train Loss:1.3641, Train Acc:63.77%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 39%|█████████████████████████████▋                                              | 39/100 [1:10:45<1:48:15, 106.48s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 39|100, Test Loss:2.2637, Test Acc:46.05%\n",
      "Epoch 40|100, Train Loss:1.2634, Train Acc:65.65%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 40%|██████████████████████████████▍                                             | 40/100 [1:12:31<1:46:22, 106.38s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 40|100, Test Loss:2.5537, Test Acc:45.67%\n",
      "Epoch 41|100, Train Loss:1.1332, Train Acc:68.48%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 41%|███████████████████████████████▏                                            | 41/100 [1:14:18<1:44:54, 106.68s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 41|100, Test Loss:2.4421, Test Acc:45.78%\n",
      "Epoch 42|100, Train Loss:1.0569, Train Acc:69.83%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 42%|███████████████████████████████▉                                            | 42/100 [1:16:05<1:43:04, 106.63s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 42|100, Test Loss:2.4363, Test Acc:46.08%\n",
      "Epoch 43|100, Train Loss:0.9226, Train Acc:72.35%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 43%|████████████████████████████████▋                                           | 43/100 [1:17:51<1:41:13, 106.56s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 43|100, Test Loss:2.6105, Test Acc:45.34%\n",
      "Epoch 44|100, Train Loss:0.8151, Train Acc:74.61%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 44%|█████████████████████████████████▍                                          | 44/100 [1:19:38<1:39:35, 106.70s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 44|100, Test Loss:2.8352, Test Acc:44.13%\n",
      "Epoch 45|100, Train Loss:0.6739, Train Acc:78.79%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 45%|██████████████████████████████████▏                                         | 45/100 [1:21:26<1:38:00, 106.91s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 45|100, Test Loss:2.6340, Test Acc:46.13%\n",
      "Epoch 46|100, Train Loss:0.5662, Train Acc:81.93%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 46%|██████████████████████████████████▉                                         | 46/100 [1:23:12<1:36:06, 106.79s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 46|100, Test Loss:2.6344, Test Acc:46.61%\n",
      "Epoch 47|100, Train Loss:0.4715, Train Acc:85.03%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 47%|███████████████████████████████████▋                                        | 47/100 [1:24:59<1:34:21, 106.83s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 47|100, Test Loss:2.7158, Test Acc:45.50%\n",
      "Epoch 48|100, Train Loss:0.3755, Train Acc:87.89%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 48%|████████████████████████████████████▍                                       | 48/100 [1:26:46<1:32:33, 106.79s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 48|100, Test Loss:2.8745, Test Acc:45.92%\n",
      "Epoch 49|100, Train Loss:0.3230, Train Acc:89.53%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 49%|█████████████████████████████████████▏                                      | 49/100 [1:28:33<1:30:45, 106.77s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 49|100, Test Loss:2.8245, Test Acc:46.93%\n",
      "Epoch 50|100, Train Loss:0.2942, Train Acc:90.71%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 50%|██████████████████████████████████████                                      | 50/100 [1:30:20<1:29:13, 107.06s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 50|100, Test Loss:2.8242, Test Acc:46.43%\n",
      "Epoch 51|100, Train Loss:0.2309, Train Acc:92.88%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 51%|██████████████████████████████████████▊                                     | 51/100 [1:32:07<1:27:19, 106.94s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 51|100, Test Loss:2.8374, Test Acc:46.61%\n",
      "Epoch 52|100, Train Loss:0.2013, Train Acc:93.76%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 52%|███████████████████████████████████████▌                                    | 52/100 [1:33:53<1:25:15, 106.58s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 52|100, Test Loss:3.1073, Test Acc:46.27%\n",
      "Epoch 53|100, Train Loss:0.1596, Train Acc:95.29%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 53%|████████████████████████████████████████▎                                   | 53/100 [1:35:38<1:23:15, 106.29s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 53|100, Test Loss:2.8631, Test Acc:47.56%\n",
      "Epoch 54|100, Train Loss:0.1357, Train Acc:96.01%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 54%|█████████████████████████████████████████                                   | 54/100 [1:37:25<1:21:28, 106.26s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 54|100, Test Loss:2.8223, Test Acc:47.88%\n",
      "Epoch 55|100, Train Loss:0.1204, Train Acc:96.43%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 55%|█████████████████████████████████████████▊                                  | 55/100 [1:39:12<1:19:53, 106.53s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 55|100, Test Loss:2.9515, Test Acc:47.02%\n",
      "Epoch 56|100, Train Loss:0.1126, Train Acc:96.75%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 56%|██████████████████████████████████████████▌                                 | 56/100 [1:40:59<1:18:13, 106.67s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 56|100, Test Loss:2.9722, Test Acc:47.18%\n",
      "Epoch 57|100, Train Loss:0.0867, Train Acc:97.69%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 57%|███████████████████████████████████████████▎                                | 57/100 [1:42:46<1:16:31, 106.78s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 57|100, Test Loss:2.9242, Test Acc:47.50%\n",
      "Epoch 58|100, Train Loss:0.0751, Train Acc:98.02%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 58%|████████████████████████████████████████████                                | 58/100 [1:44:32<1:14:41, 106.70s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 58|100, Test Loss:2.9570, Test Acc:47.65%\n",
      "Epoch 59|100, Train Loss:0.0683, Train Acc:98.27%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 59%|████████████████████████████████████████████▊                               | 59/100 [1:46:18<1:12:47, 106.53s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 59|100, Test Loss:2.9817, Test Acc:48.33%\n",
      "Epoch 60|100, Train Loss:0.0553, Train Acc:98.67%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 60%|█████████████████████████████████████████████▌                              | 60/100 [1:48:05<1:11:02, 106.56s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 60|100, Test Loss:2.9426, Test Acc:47.98%\n",
      "Epoch 61|100, Train Loss:0.0450, Train Acc:98.98%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 61%|██████████████████████████████████████████████▎                             | 61/100 [1:49:52<1:09:17, 106.61s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 61|100, Test Loss:3.0333, Test Acc:47.24%\n",
      "Epoch 62|100, Train Loss:0.0414, Train Acc:99.14%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 62%|███████████████████████████████████████████████                             | 62/100 [1:51:39<1:07:37, 106.76s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 62|100, Test Loss:2.8907, Test Acc:48.06%\n",
      "Epoch 63|100, Train Loss:0.0375, Train Acc:99.17%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 63%|███████████████████████████████████████████████▉                            | 63/100 [1:53:25<1:05:44, 106.61s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 63|100, Test Loss:2.9435, Test Acc:48.49%\n",
      "Epoch 64|100, Train Loss:0.0287, Train Acc:99.41%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 64%|████████████████████████████████████████████████▋                           | 64/100 [1:55:13<1:04:13, 107.05s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 64|100, Test Loss:2.9292, Test Acc:48.92%\n",
      "Epoch 65|100, Train Loss:0.0211, Train Acc:99.64%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 65%|█████████████████████████████████████████████████▍                          | 65/100 [1:57:01<1:02:38, 107.39s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 65|100, Test Loss:2.8685, Test Acc:49.12%\n",
      "Epoch 66|100, Train Loss:0.0154, Train Acc:99.80%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 66%|██████████████████████████████████████████████████▏                         | 66/100 [1:58:47<1:00:37, 106.98s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 66|100, Test Loss:2.8206, Test Acc:49.84%\n",
      "Epoch 67|100, Train Loss:0.0147, Train Acc:99.78%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 67%|████████████████████████████████████████████████████▎                         | 67/100 [2:00:35<58:56, 107.16s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 67|100, Test Loss:2.8584, Test Acc:49.07%\n",
      "Epoch 68|100, Train Loss:0.0120, Train Acc:99.85%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 68%|█████████████████████████████████████████████████████                         | 68/100 [2:02:22<57:04, 107.02s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 68|100, Test Loss:2.7969, Test Acc:49.62%\n",
      "Epoch 69|100, Train Loss:0.0083, Train Acc:99.92%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 69%|█████████████████████████████████████████████████████▊                        | 69/100 [2:04:08<55:07, 106.69s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 69|100, Test Loss:2.7956, Test Acc:50.05%\n",
      "Epoch 70|100, Train Loss:0.0081, Train Acc:99.91%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 70%|██████████████████████████████████████████████████████▌                       | 70/100 [2:05:54<53:14, 106.49s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 70|100, Test Loss:2.7312, Test Acc:50.29%\n",
      "Epoch 71|100, Train Loss:0.0072, Train Acc:99.93%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 71%|███████████████████████████████████████████████████████▍                      | 71/100 [2:07:40<51:25, 106.38s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 71|100, Test Loss:2.7562, Test Acc:50.00%\n",
      "Epoch 72|100, Train Loss:0.0065, Train Acc:99.93%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 72%|████████████████████████████████████████████████████████▏                     | 72/100 [2:09:26<49:34, 106.23s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 72|100, Test Loss:2.7303, Test Acc:50.36%\n",
      "Epoch 73|100, Train Loss:0.0055, Train Acc:99.95%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 73%|████████████████████████████████████████████████████████▉                     | 73/100 [2:11:12<47:47, 106.22s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 73|100, Test Loss:2.7339, Test Acc:49.84%\n",
      "Epoch 74|100, Train Loss:0.0055, Train Acc:99.95%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 74%|█████████████████████████████████████████████████████████▋                    | 74/100 [2:12:59<46:05, 106.38s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 74|100, Test Loss:2.7186, Test Acc:50.13%\n",
      "Epoch 75|100, Train Loss:0.0065, Train Acc:99.93%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 75%|██████████████████████████████████████████████████████████▌                   | 75/100 [2:14:46<44:25, 106.61s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 75|100, Test Loss:2.6874, Test Acc:49.95%\n",
      "Epoch 76|100, Train Loss:0.0046, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 76%|███████████████████████████████████████████████████████████▎                  | 76/100 [2:16:31<42:32, 106.34s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 76|100, Test Loss:2.6775, Test Acc:49.86%\n",
      "Epoch 77|100, Train Loss:0.0049, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 77%|████████████████████████████████████████████████████████████                  | 77/100 [2:18:17<40:38, 106.02s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 77|100, Test Loss:2.6858, Test Acc:49.97%\n",
      "Epoch 78|100, Train Loss:0.0046, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 78%|████████████████████████████████████████████████████████████▊                 | 78/100 [2:20:04<39:00, 106.40s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 78|100, Test Loss:2.6682, Test Acc:49.52%\n",
      "Epoch 79|100, Train Loss:0.0045, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 79%|█████████████████████████████████████████████████████████████▌                | 79/100 [2:21:50<37:14, 106.40s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 79|100, Test Loss:2.6268, Test Acc:50.17%\n",
      "Epoch 80|100, Train Loss:0.0040, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 80%|██████████████████████████████████████████████████████████████▍               | 80/100 [2:23:37<35:26, 106.33s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 80|100, Test Loss:2.5960, Test Acc:50.22%\n",
      "Epoch 81|100, Train Loss:0.0039, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 81%|███████████████████████████████████████████████████████████████▏              | 81/100 [2:25:24<33:46, 106.67s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 81|100, Test Loss:2.5999, Test Acc:49.76%\n",
      "Epoch 82|100, Train Loss:0.0042, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 82%|███████████████████████████████████████████████████████████████▉              | 82/100 [2:27:11<32:01, 106.74s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 82|100, Test Loss:2.6098, Test Acc:49.71%\n",
      "Epoch 83|100, Train Loss:0.0040, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 83%|████████████████████████████████████████████████████████████████▋             | 83/100 [2:28:57<30:12, 106.63s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 83|100, Test Loss:2.5631, Test Acc:50.00%\n",
      "Epoch 84|100, Train Loss:0.0041, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 84%|█████████████████████████████████████████████████████████████████▌            | 84/100 [2:30:44<28:25, 106.62s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 84|100, Test Loss:2.5575, Test Acc:50.01%\n",
      "Epoch 85|100, Train Loss:0.0049, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 85%|██████████████████████████████████████████████████████████████████▎           | 85/100 [2:32:32<26:44, 106.99s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 85|100, Test Loss:2.5417, Test Acc:49.93%\n",
      "Epoch 86|100, Train Loss:0.0043, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 86%|███████████████████████████████████████████████████████████████████           | 86/100 [2:34:18<24:56, 106.89s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 86|100, Test Loss:2.5533, Test Acc:50.18%\n",
      "Epoch 87|100, Train Loss:0.0045, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 87%|███████████████████████████████████████████████████████████████████▊          | 87/100 [2:36:06<23:13, 107.23s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 87|100, Test Loss:2.5364, Test Acc:50.21%\n",
      "Epoch 88|100, Train Loss:0.0045, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 88%|████████████████████████████████████████████████████████████████████▋         | 88/100 [2:37:54<21:26, 107.21s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 88|100, Test Loss:2.5355, Test Acc:49.73%\n",
      "Epoch 89|100, Train Loss:0.0050, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 89%|█████████████████████████████████████████████████████████████████████▍        | 89/100 [2:39:40<19:37, 107.00s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 89|100, Test Loss:2.5130, Test Acc:49.72%\n",
      "Epoch 90|100, Train Loss:0.0049, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 90%|██████████████████████████████████████████████████████████████████████▏       | 90/100 [2:41:27<17:49, 106.98s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 90|100, Test Loss:2.4961, Test Acc:49.81%\n",
      "Epoch 91|100, Train Loss:0.0043, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 91%|██████████████████████████████████████████████████████████████████████▉       | 91/100 [2:43:15<16:04, 107.18s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 91|100, Test Loss:2.4949, Test Acc:49.45%\n",
      "Epoch 92|100, Train Loss:0.0051, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 92%|███████████████████████████████████████████████████████████████████████▊      | 92/100 [2:45:02<14:17, 107.20s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 92|100, Test Loss:2.4868, Test Acc:49.59%\n",
      "Epoch 93|100, Train Loss:0.0043, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 93%|████████████████████████████████████████████████████████████████████████▌     | 93/100 [2:46:49<12:30, 107.19s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 93|100, Test Loss:2.5118, Test Acc:49.67%\n",
      "Epoch 94|100, Train Loss:0.0045, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 94%|█████████████████████████████████████████████████████████████████████████▎    | 94/100 [2:48:37<10:44, 107.49s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 94|100, Test Loss:2.4620, Test Acc:49.59%\n",
      "Epoch 95|100, Train Loss:0.0054, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 95%|██████████████████████████████████████████████████████████████████████████    | 95/100 [2:50:27<09:01, 108.29s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 95|100, Test Loss:2.4755, Test Acc:49.25%\n",
      "Epoch 96|100, Train Loss:0.0052, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 96%|██████████████████████████████████████████████████████████████████████████▉   | 96/100 [2:52:16<07:13, 108.34s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 96|100, Test Loss:2.4687, Test Acc:49.42%\n",
      "Epoch 97|100, Train Loss:0.0045, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 97%|███████████████████████████████████████████████████████████████████████████▋  | 97/100 [2:54:06<05:26, 108.78s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 97|100, Test Loss:2.4697, Test Acc:49.12%\n",
      "Epoch 98|100, Train Loss:0.0045, Train Acc:99.97%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 98%|████████████████████████████████████████████████████████████████████████████▍ | 98/100 [2:55:55<03:37, 109.00s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 98|100, Test Loss:2.4639, Test Acc:49.09%\n",
      "Epoch 99|100, Train Loss:0.0045, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 99%|█████████████████████████████████████████████████████████████████████████████▏| 99/100 [2:57:45<01:49, 109.31s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 99|100, Test Loss:2.4609, Test Acc:48.98%\n",
      "Epoch 100|100, Train Loss:0.0046, Train Acc:99.96%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████| 100/100 [2:59:34<00:00, 107.75s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 100|100, Test Loss:2.4594, Test Acc:49.04%\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "for epoch in tqdm(range(num_epochs)):\n",
    "    model.train()\n",
    "    temp_loss, temp_correct = 0, 0\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        images, labels = images.cuda(), labels.cuda()\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(images)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        temp_correct += (predicted == labels).sum().item()\n",
    "        temp_loss += loss\n",
    "    print(\n",
    "        'Epoch {}|{}, Train Loss:{:.4f}, Train Acc:{:.2f}%'.format(epoch + 1, num_epochs, temp_loss / len(train_loader),\n",
    "                                                                   temp_correct / len(train_dataset) * 100))\n",
    "    train_loss.append(temp_loss / len(train_loader))\n",
    "    train_acc.append(temp_correct / len(train_dataset))\n",
    "\n",
    "    temp_loss, temp_correct = 0, 0\n",
    "    model.eval()\n",
    "    with torch.no_grad():\n",
    "        for data in test_loader:\n",
    "            images, labels = data\n",
    "            images, labels = images.cuda(), labels.cuda()\n",
    "            outputs = model(images)\n",
    "            loss = criterion(outputs, labels)\n",
    "            _, predicted = torch.max(outputs.data, 1)\n",
    "            temp_correct += (predicted == labels).sum().item()\n",
    "            temp_loss += loss\n",
    "    print('Epoch {}|{}, Test Loss:{:.4f}, Test Acc:{:.2f}%'.format(epoch + 1, num_epochs, temp_loss / len(test_loader),\n",
    "                                                                   temp_correct / len(test_dataset) * 100))\n",
    "    test_loss.append(temp_loss / len(test_loader))\n",
    "    test_acc.append(temp_correct / len(test_dataset))\n",
    "\n",
    "    if temp_loss < best_val_loss:\n",
    "        best_val_loss = temp_loss\n",
    "        torch.save(model.state_dict(), save_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b0d0de74",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:40:36.919064Z",
     "start_time": "2024-06-06T09:40:27.281725Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5.316422939300537, 5.222929954528809, 5.176801681518555, 5.110921859741211, 5.064579963684082, 4.9519805908203125, 4.898279666900635, 4.832307815551758, 4.437054634094238, 4.347993850708008, 4.280548095703125, 4.049479961395264, 3.9840424060821533, 3.875673770904541, 3.8424787521362305, 3.745112657546997, 3.6109297275543213, 3.540447235107422, 3.3868472576141357, 3.241098403930664, 3.153594493865967, 3.1020495891571045, 3.005682945251465, 2.8375914096832275, 2.78859281539917, 2.657825231552124, 2.579540967941284, 2.4128997325897217, 2.3451406955718994, 2.202895402908325, 2.0791397094726562, 2.122281789779663, 2.0332255363464355, 1.8661885261535645, 1.852237582206726, 1.7263630628585815, 1.4870718717575073, 1.540959119796753, 1.3640532493591309, 1.2633640766143799, 1.133244514465332, 1.0569216012954712, 0.9226118326187134, 0.8151305913925171, 0.6739285588264465, 0.5662105083465576, 0.47147056460380554, 0.37545737624168396, 0.32304102182388306, 0.2942039370536804, 0.23090317845344543, 0.20128589868545532, 0.159612238407135, 0.13573014736175537, 0.12042871862649918, 0.11257532238960266, 0.08669815212488174, 0.07507729530334473, 0.06831230223178864, 0.05526350438594818, 0.04495964199304581, 0.04142564907670021, 0.03752085193991661, 0.02873583883047104, 0.02111317217350006, 0.015432526357471943, 0.014733332209289074, 0.012048063799738884, 0.008303262293338776, 0.008141216821968555, 0.007214073557406664, 0.006548356730490923, 0.005540798418223858, 0.005502040032297373, 0.006503740791231394, 0.0045879608951509, 0.004944948945194483, 0.004566516261547804, 0.004516602959483862, 0.00396885396912694, 0.0038937365170568228, 0.004180509597063065, 0.004041202366352081, 0.004127221181988716, 0.004947347100824118, 0.004322373773902655, 0.004516709130257368, 0.0045339795760810375, 0.00500511983409524, 0.004941319581121206, 0.0043367650359869, 0.005076409783214331, 0.004344001412391663, 0.004465795122087002, 0.005384235177189112, 0.005180036649107933, 0.004518405068665743, 0.004493487533181906, 0.004505468998104334, 0.004641178995370865]\n",
      "[16.131755828857422, 5.707827568054199, 11.660992622375488, 5.107970237731934, 5.1478800773620605, 5.470736980438232, 49.36113357543945, 4.3462677001953125, 4.31815242767334, 737.4813232421875, 3.9044926166534424, 3.8080525398254395, 3.671372175216675, 4.3720269203186035, 20.74846076965332, 3.2843568325042725, 3.2088401317596436, 3.1922991275787354, 3.2980804443359375, 3.6478328704833984, 3.041161298751831, 3.1118075847625732, 3.2261383533477783, 16.962425231933594, 3.0454699993133545, 5.709249973297119, 2.8014917373657227, 2.5583300590515137, 2.4598166942596436, 3.887148380279541, 4.184560298919678, 2.214812994003296, 7.074855804443359, 2.876523494720459, 2.5485074520111084, 2.251844882965088, 2.739027976989746, 2.857138156890869, 2.263714551925659, 2.5536739826202393, 2.4421277046203613, 2.436302900314331, 2.61047625541687, 2.8352127075195312, 2.6339519023895264, 2.6343698501586914, 2.7157671451568604, 2.874499559402466, 2.824463129043579, 2.8242061138153076, 2.837376117706299, 3.1072967052459717, 2.8631432056427, 2.8223156929016113, 2.9515042304992676, 2.9721908569335938, 2.924201726913452, 2.957028865814209, 2.9816713333129883, 2.942573308944702, 3.033257246017456, 2.8906781673431396, 2.943495035171509, 2.9291672706604004, 2.8684606552124023, 2.8206167221069336, 2.858388662338257, 2.7969448566436768, 2.795567750930786, 2.7311956882476807, 2.7561872005462646, 2.730321168899536, 2.733896255493164, 2.7186381816864014, 2.68743634223938, 2.677464723587036, 2.6857619285583496, 2.668222188949585, 2.6268322467803955, 2.59604811668396, 2.59987735748291, 2.609792947769165, 2.5630924701690674, 2.557499885559082, 2.5416781902313232, 2.5532500743865967, 2.5364370346069336, 2.5355355739593506, 2.5129921436309814, 2.4961392879486084, 2.4948837757110596, 2.486757755279541, 2.511789321899414, 2.462047815322876, 2.475497245788574, 2.4687163829803467, 2.4697206020355225, 2.4638752937316895, 2.460916519165039, 2.459380626678467]\n"
     ]
    }
   ],
   "source": [
    "train_loss = [float(loss) for loss in train_loss]\n",
    "print(train_loss)\n",
    "test_loss = [float(loss) for loss in test_loss]\n",
    "print(test_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e321764a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:40:36.950490Z",
     "start_time": "2024-06-06T09:40:36.919985Z"
    }
   },
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\n",
    "    'train_loss': train_loss,\n",
    "    'train_acc': train_acc,\n",
    "    'test_loss': test_loss,\n",
    "    'test_acc': test_acc\n",
    "})\n",
    "df.to_csv('experiment.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "3e70d142",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:40:37.124370Z",
     "start_time": "2024-06-06T09:40:36.952490Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZd0lEQVR4nO3dd3gU1f7H8femJ6RQYhJKIEGKdJAmqNeGAipIuyIiRLD8UKSIWBCleSk2QIUrVy9gF0QFRVAuRlApAtKRJggGgSQgkEAIKbvz++OQQCBAAkkm2XxezzPPTqbsfjMo++HMmXMclmVZiIiIiLgJD7sLEBERESlICjciIiLiVhRuRERExK0o3IiIiIhbUbgRERERt6JwIyIiIm5F4UZERETcipfdBRQ1l8vFgQMHCAoKwuFw2F2OiIiI5IFlWRw/fpxKlSrh4XHxtplSF24OHDhAZGSk3WWIiIjIZdi3bx9VqlS56DGlLtwEBQUB5uIEBwfbXI2IiIjkRXJyMpGRkdnf4xdT6sJN1q2o4OBghRsREZESJi9dStShWERERNyKwo2IiIi4FYUbERERcSulrs9NXjmdTjIyMuwuQ/LJ29sbT09Pu8sQEREbKdycw7Is4uPjOXbsmN2lyGUqW7YsERERGsdIRKSUUrg5R1awCQsLIyAgQF+QJYhlWZw8eZLExEQAKlasaHNFIiJiB4WbszidzuxgU6FCBbvLkcvg7+8PQGJiImFhYbpFJSJSCqlD8Vmy+tgEBATYXIlciaw/P/WZEhEpnRRucqFbUSWb/vxEREo3hRsRERFxK7aGm59++okOHTpQqVIlHA4H8+bNu+Q5S5cu5dprr8XX15caNWrw3nvvFXqdIiIiUnLYGm5SUlJo1KgRU6dOzdPxe/bs4a677uKWW25hw4YNDB48mIcffphFixYVcqWlS1RUFJMnT7a7DBERkcti69NS7du3p3379nk+ftq0aURHR/P6668DUKdOHZYtW8akSZNo27ZtYZVZItx88800bty4QELJmjVrKFOmzJUXJSKlmssFmZlmycgAyzLbs14dDvDyMou3N3h6mnPS0yEtzSwZGeDhkXOxLHNc1qvLZd7L4TD7s9azut9lvZ59fNb5uTn7fIfj/LrhzOdkvbpc4HSeec3tfc6t59z1cz8/a/3sml2ui1/zc9/v7JrPvkYeHmf2n7ucfW0vdE0u9HtkvXp7g50PHZeoR8FXrlxJmzZtcmxr27YtgwcPvuA5aWlppKWlZf+cnJxcWOUVa5Zl4XQ68fK69B/5VVddVQQViUhhSk2FffvMEhdnXk+dMl9qnp5mAThxwizHj595TU4+s6SkmOPOPs+yTOjIyDgTXM6V9UWZH2cHCSnZWrWCFStsLMAqJgBr7ty5Fz2mZs2a1rhx43JsW7BggQVYJ0+ezPWckSNHWsB5S1JS0nnHpqamWlu3brVSU1Ozt7lclnXihD2Ly5W3axcTE3Pe7zdz5kwLsBYuXGhde+21lre3t7VkyRJr165dVseOHa2wsDCrTJkyVrNmzazFixfneL9q1apZkyZNyv4ZsN59912rU6dOlr+/v1WjRg3rq6++ylNtmZmZVt++fa2oqCjLz8/PqlWrljV58uTzjps+fbpVt25dy8fHx4qIiLD69++fve/o0aPWo48+aoWFhVm+vr5WvXr1rPnz51/wM3P7cxRxV2lplrVxo2V99JFlPfecZd11l2VVrZrbv8dL5uLlZVmenpblcJy/z+Ew+7y8zOLhkftx5y4eHuZ4b+/zl6zPO/u9HA7zs4fH+ftyq+dC73Xukp/rcPbvmlvdWZ+X9ZlZ62cff7FrlFVT1rk+Ppbl62tZfn7m1dfXbDv3s7I+L+v3zFpaty74/9aTkpIu+P19rhLVcnM5hg0bxpAhQ7J/Tk5OJjIyMs/nnzwJgYGFUdmlnTgBebk79MYbb7Bz507q16/PmDFjAPjtt98AeO6553jttdeoXr065cqVY9++fdx5552MHTsWX19fPvjgAzp06MCOHTuoWrXqBT9j9OjRvPLKK7z66qu89dZb9OzZkz///JPy5ctftDaXy0WVKlWYM2cOFSpUYMWKFTz66KNUrFiRe++9F4C3336bIUOGMGHCBNq3b09SUhLLly/PPr99+/YcP36cjz76iKuvvpqtW7dqcD5xe8nJ8Oef8Ndf5u+hjAxzuyY9HRITYfNms+zYYVpPclOmDFStapbISPNz1m0Tp9N8rZUpA0FBZgkMNK8hIRAcbJasv4POPg/MbYezl9xaXby9c95yOvd/26z3PLsFyMMDfH3N4uNz5vYJnLlVknUr6GLOvZVkWXk7L7/yU1N+3jPrtTDrdudRM0pUuImIiCAhISHHtoSEBIKDg7NHpj2Xr68vvr6+RVGebUJCQvDx8SEgIICIiAgAtm/fDsCYMWO4/fbbs48tX748jRo1yv75pZdeYu7cuXz99dc88cQTF/yMBx98kB49egAwbtw43nzzTVavXk27du0uWpu3tzejR4/O/jk6OpqVK1fy2WefZYebf/3rXzz11FMMGjQo+7jmzZsD8P3337N69Wq2bdtGrVq1AKhevfqlL4pICeFywW+/wbJlZtmyxYSapKS8v0dICDRoYJb69c1r3bpQvrx7fYE5HOcHpIsde/ZrYclPTfl5z7NfC4M7/XeRmxIVblq1asXChQtzbFu8eDGtWrUqtM8MCDAtKHYoiIGSmzVrluPnEydOMGrUKBYsWMDBgwfJzMwkNTWVuLi4i75Pw4YNs9fLlClDcHBw9hxOlzJ16lRmzJhBXFwcqamppKen07hxY8BMk3DgwAFuu+22XM/dsGEDVapUyQ42Iu5gzx5YsAAWLTKB5kLz9JYvb1pcgoJMK4a3t3kNCYF69aBhQxNkqlRx/y8rkfywNdycOHGCXbt2Zf+8Z88eNmzYQPny5alatSrDhg1j//79fPDBBwD069ePKVOm8Mwzz9C3b19++OEHPvvsMxYsWFBoNTocebs1VFyd+9TT0KFDWbx4Ma+99ho1atTA39+fbt26kZ6eftH38fb2zvGzw+HAdalu+8CsWbMYOnQor7/+Oq1atSIoKIhXX32VVatWAVywxS3LpfaLlASHDsG6dfD99ybUbNuWc3+ZMqYD5g03QLNmEBVlbiUFBdlSrkiJZ2u4+fXXX7nllluyf87qGxMTE8N7773HwYMHc7QoREdHs2DBAp588kneeOMNqlSpwn//+99S/xg4gI+PD86sm+EXsXz5ch588EE6d+4MmIC5d+/eQqtr+fLltG7dmscffzx72+7du7PXg4KCiIqKIjY2Nsd/C1kaNmzIX3/9xc6dO9V6IyXC8eOwfLlZ1q83y4EDOY/x9ITrr4e77oJbb4VGjUyrjIgUDFvDzc0334x1kef+cht9+Oabb2b9+vWFWFXJFBUVxapVq9i7dy+BgYEXbFWpWbMmX375JR06dMDhcPDiiy/mqQXmctWsWZMPPviARYsWER0dzYcffsiaNWuIjo7OPmbUqFH069ePsLCw7M7Dy5cvZ8CAAdx000384x//oGvXrkycOJEaNWqwfft2HA7HJfv7iBSVn3+G+fPhxx9h7doznW7PVrMmXHedCTR33AHlyhV9nSKlRYnqcyMXNnToUGJiYqhbty6pqanMnDkz1+MmTpxI3759ad26NaGhoTz77LOFOvbP//3f/7F+/Xq6d++Ow+GgR48ePP7443z77bfZx8TExHDq1CkmTZrE0KFDCQ0NpVu3btn7v/jiC4YOHUqPHj1ISUmhRo0aTJgwodBqFsmr48dh0CA493+36Gj4xz/MLaYmTUzfGN1iEik6DutiTSduKDk5mZCQEJKSkggODs6x79SpU+zZs4fo6Gj8/PxsqlCulP4cpSisWAG9esEff5i+eT17mhaZm24y/WVEpGBd7Pv7XGq5ERHJh1OnYOxYGDfOPMZdrRp88IFpqRGR4sHWiTOl5OvXrx+BgYG5Lv369bO7PJErlpQE334Lzz8PN94IZcvCv/5lgk2vXrBxo4KNSHGjlhu5ImPGjGHo0KG57rtUs6FIcRUXB199BfPmmU7C53YQrlQJJk2C0+NQikgxo3AjVyQsLIywsDC7yxC5YhkZ8N//mmXdupz7rr7atNrccIN5rVlTg+aJFGcKNyJSqlkWzJkDw4dD1piiHh5mHJpOneCee0y4EZGSQ+FGREqtpUvhmWdgzRrzc3i46Vtz332gBkmRkkvhRkRKpX//G/r3N+tlysDTT8NTT5mZsUWkZFO4EZFS5+uvYcAAs963r3msOzzc3ppEpOAo3IhIqbJmjbnt5HLBI4/Af/6jzsEi7kbj3IhIqbFnD9x9N6SmQrt25taUgo2I+1G4cRM333wzgwcPLrD3e/DBB+nUqVOBvZ+I3Y4cgfbtITERGjeGzz4DL7Vdi7glhRsRcXtbt8Ltt8OOHRAZCQsWaCJLEXemcHMplgWZKfYseZzT9MEHH+THH3/kjTfewOFw4HA42Lt3L1u2bKF9+/YEBgYSHh5Or169OHz4cPZ5n3/+OQ0aNMDf358KFSrQpk0bUlJSGDVqFO+//z5fffVV9vstXbr0knU8++yz1KpVi4CAAKpXr86LL75IRkZGjmPmz59P8+bN8fPzIzQ0lM6dO2fvS0tL49lnnyUyMhJfX19q1KjB9OnT8/bnJJKLjAwzVUKTJmZgvnLlYOFCM8KwiLgvNcpeivMkfGbTs6H3ngCvMpc87I033mDnzp3Ur1+fMWPGAODt7U2LFi14+OGHmTRpEqmpqTz77LPce++9/PDDDxw8eJAePXrwyiuv0LlzZ44fP87PP/+MZVkMHTqUbdu2kZyczMyZMwEoX778JesICgrivffeo1KlSmzevJlHHnmEoKAgnnnmGQAWLFhA586dGT58OB988AHp6eksXLgw+/zevXuzcuVK3nzzTRo1asSePXtyhDGR/Fi3zjwJtXGj+fnuu+Htt6FKFXvrEpHCp3DjBkJCQvDx8SEgIICIiAgA/vWvf9GkSRPGjRuXfdyMGTOIjIxk586dnDhxgszMTLp06UK1atUAaNCgQfax/v7+pKWlZb9fXrzwwgvZ61FRUQwdOpRZs2Zlh5uxY8dy3333MXr06OzjGjVqBMDOnTv57LPPWLx4MW3atAGgevXq+b0UIoCZE6pbNzMnVIUK8Oab0KOHOg+LlBYKN5fiGWBaUOz67Mu0ceNGlixZQmAuI5Lt3r2bO+64g9tuu40GDRrQtm1b7rjjDrp160a5cuUu+zNnz57Nm2++ye7du7PD09mTZ27YsIFHHnkk13M3bNiAp6cnN91002V/vgiYWbwfe8wEm86dYdo0jTYsUtoo3FyKw5GnW0PFzYkTJ+jQoQMvv/zyefsqVqyIp6cnixcvZsWKFfzvf//jrbfeYvjw4axatYro6Oh8f97KlSvp2bMno0ePpm3btoSEhDBr1ixef/317GP8/f0veP7F9onkxwsvQHw81KoFn34Kvr52VyQiRU0dit2Ej48PTqcz++drr72W3377jaioKGrUqJFjKVPGhDWHw8H111/P6NGjWb9+PT4+PsydOzfX97uUFStWUK1aNYYPH06zZs2oWbMmf/75Z45jGjZsSGxsbK7nN2jQAJfLxY8//pjfX10k26+/wtSpZv3ttxVsREorhRs3ERUVxapVq9i7dy+HDx+mf//+HDlyhB49erBmzRp2797NokWL6NOnD06nk1WrVjFu3Dh+/fVX4uLi+PLLLzl06BB16tTJfr9NmzaxY8cODh8+fN5TT+eqWbMmcXFxzJo1i927d/Pmm29mB6UsI0eO5NNPP2XkyJFs27aNzZs3Z7csRUVFERMTQ9++fZk3bx579uxh6dKlfPbZZ4VzwcTtOJ3Qr595yLBnT7j1VrsrEhHbWKVMUlKSBVhJSUnn7UtNTbW2bt1qpaam2lDZldmxY4d13XXXWf7+/hZg7dmzx9q5c6fVuXNnq2zZspa/v791zTXXWIMHD7ZcLpe1detWq23bttZVV11l+fr6WrVq1bLeeuut7PdLTEy0br/9diswMNACrCVLllyyhqefftqqUKGCFRgYaHXv3t2aNGmSFRISkuOYL774wmrcuLHl4+NjhYaGWl26dMnel5qaaj355JNWxYoVLR8fH6tGjRrWjBkz8n0tSvKfo1y+t96yLLCskBDLio+3uxoRKWgX+/4+l8Oy8jiYiptITk4mJCSEpKSkHJ1dAU6dOsWePXuIjo7Gz8/PpgrlSunPsfQ5eBCuuQaSk82UCo89ZndFIlLQLvb9fS7dlhKREs2yYOBAE2xatIBHH7W7IhGxm8KN5Mm4ceMIDAzMdWnfvr3d5UkplZ4OvXrB55+Dh4d57NvT0+6qRMRuehRc8qRfv37ce++9ue7TY9xih2PHoEsXWLLETID57rtmmgUREYUbyZPy5cvnaQoGkaIQFwd33gm//QaBgfDFF3DHHXZXJSLFhcJNLlwul90lyBXQn59727LFBJmDB6FiRTMRZuPGdlclIsWJws1ZfHx88PDw4MCBA1x11VX4+Pjg0GQ0JYZlWaSnp3Po0CE8PDzw8fGxuyQpYImJcNddJtjUq2eCTdWqdlclIsWNws1ZPDw8iI6O5uDBgxw4cMDucuQyBQQEULVqVTw81F/enaSnm8kw4+KgZk346SfQnVIRyY3CzTl8fHyoWrUqmZmZ+Zp+QIoHT09PvLy81OLmhgYOhJ9/huBg+PprBRsRuTCFm1w4HA68vb3x9va2uxQRwcwT9Z//mHlsP/3UDNgnInIharcXkWLtxx9Nqw3A+PHmKSkRkYtRuBGRYuvIEdPPJjMT7r8fnnnG7opEpCRQuBGRYmvKFDh8GOrWhf/+19yWEhG5FIUbESmWUlLgzTfN+osvggbCFpG8UrgRkWJpxgz4+2+oXt3cmhIRySuFGxEpdjIy4PXXzfrTT5u5o0RE8krhRkSKndmz4c8/ISwMYmLsrkZEShqFGxEpViwLXn7ZrA8erL42IpJ/CjciUqwsXGgmxwwKgsces7saESmJFG5EpFjJarXp1w/KlrW1FBEpoRRuRKTYWLHCzB/l42NuSYmIXA6FGxEpNl591bz27g2VKtlbi4iUXAo3IlIs/PEHfPWVWX/qKXtrEZGSTeFGRIqFKVPMk1Jt22rWbxG5Mgo3ImK748dh+nSzPmiQvbWISMmncCMitvvgA0hOhlq1TMuNiMiVULgREVu5XGcmyBw4EDz0t5KIXCH9NSIitlq0CHbuhOBg85SUiMiVUrgREVu98YZ5feghMyqxiMiVUrgREdts325abhwOeOIJu6sREXehcCMitsnqa9OxI1Svbm8tIuI+FG5ExBbHjsH775v1gQNtLUVE3IzCjYjYYsYMOHkS6teHW26xuxoRcScKNyJS5JxOmDrVrA8caPrciIgUFIUbESlyCxeauaTKlYOePe2uRkTcje3hZurUqURFReHn50fLli1ZvXr1RY+fPHkytWvXxt/fn8jISJ588klOnTpVRNWKSEF46y3z+tBDEBBgby0i4n5sDTezZ89myJAhjBw5knXr1tGoUSPatm1LYmJirsd/8sknPPfcc4wcOZJt27Yxffp0Zs+ezfPPP1/ElYvI5dq+HRYvNreiHn/c7mpExB3ZGm4mTpzII488Qp8+fahbty7Tpk0jICCAGTNm5Hr8ihUruP7667n//vuJiorijjvuoEePHpds7RGR4mPKFPPasSNER9tbi4i4J9vCTXp6OmvXrqVNmzZnivHwoE2bNqxcuTLXc1q3bs3atWuzw8wff/zBwoULufPOOy/4OWlpaSQnJ+dYRMQeyclnHv8eMMDeWkTEfXnZ9cGHDx/G6XQSHh6eY3t4eDjbt2/P9Zz777+fw4cPc8MNN2BZFpmZmfTr1++it6XGjx/P6NGjC7R2Ebk8770HJ05A3bpw6612VyMi7sr2DsX5sXTpUsaNG8e///1v1q1bx5dffsmCBQt46aWXLnjOsGHDSEpKyl727dtXhBWLSBaX60xH4iee0OPfIlJ4bGu5CQ0NxdPTk4SEhBzbExISiIiIyPWcF198kV69evHwww8D0KBBA1JSUnj00UcZPnw4Hh7nZzVfX198fX0L/hcQkXxZtAh27YKQEOjVy+5qRMSd2dZy4+PjQ9OmTYmNjc3e5nK5iI2NpVWrVrmec/LkyfMCjKenJwCWZRVesSJyxbIG7evbFwID7a1FRNybbS03AEOGDCEmJoZmzZrRokULJk+eTEpKCn369AGgd+/eVK5cmfHjxwPQoUMHJk6cSJMmTWjZsiW7du3ixRdfpEOHDtkhR0SKn6NHTcsNwP/9n721iIj7szXcdO/enUOHDjFixAji4+Np3Lgx3333XXYn47i4uBwtNS+88AIOh4MXXniB/fv3c9VVV9GhQwfGjh1r168gInnwzTeQmWnmkapd2+5qRMTdOaxSdj8nOTmZkJAQkpKSCA4OtrsckVKhc2eYNw9GjAA9vCgilyM/398l6mkpESl5UlLgu+/Mepcu9tYiIqWDwo2IFKrvvoNTp6B6dWjY0O5qRKQ0ULgRkUL15ZfmtUsXjW0jIkVD4UZECk1amulMDLolJSJFR+FGRArNDz+Y+aQqVoSWLe2uRkRKC4UbESk0WbekOneGXAYQFxEpFPrrRkQKhdNpHv8G3ZISkaKlcCMihWLZMjh8GMqXh3/8w+5qRKQ0UbgRkUKRdUuqY0fw9ra3FhEpXRRuRKTAWVbOR8BFRIqSwo2IFLjVq+Gvv6BMGbj9drurEZHSRuFGRAqUZcELL5j1e+4BPz976xGR0kfhRkQK1Ny58P334OsLY8bYXY2IlEYKNyJSYE6ehCFDzPrTT8PVV9tbj4iUTgo3IlJgXn4Z/vwTIiNh2DC7qxGR0krhRkQKxJ49JtwAvP46BATYW4+IlF4KNyJSIIYMMRNl3nordOtmdzUiUpop3IjIFVu0yEy14OkJb74JDofdFYlIaaZwIyJXJDMTBg826wMHQr16tpYjIqJwIyJX5r33YPt2CA2FkSPtrkZEROFGRK5AaiqMGmXWhw+HkBBbyxERARRuROQKTJkC+/dD1arQr5/d1YiIGAo3InJZjh2D8ePN+ujRmmZBRIoPhRsRuSyvvgpHj0LdutCrl93ViIicoXAjIvl28CBMnmzWx40zj4CLiBQXCjcikm8vvWTmkbruOujY0e5qRERyUrgRkXzZuRPefdesT5igAftEpPhRuBGRPNu/H+680wzc164d3HST3RWJiJxP4UZE8uTAAbjlFti9G6Kj4Z137K5IRCR3CjcickkHD5oJMX//HapVgyVLIDLS7qpERHKncCMiF5WQYILNjh1msL4lS0zAEREprhRuROSCMjOhbVszd1SVKibYREfbXZWIyMUp3IjIBc2aBRs3QoUKJthUr253RSIil6ZwIyK5crnMo94AQ4ZAjRr21iMiklcKNyKSq/nz4bffICgIHn/c7mpERPJO4UZEzmNZZybF7N8fypa1tRwRkXxRuBGR8yxdCqtWmZm+Bw+2uxoRkfxRuBGR82S12vTtC+Hh9tYiIpJfCjciksPatbB4sZnp++mn7a5GRCT/FG5EJIesVpsePSAqytZSREQui8KNiGTbvh2+/NKsP/ecvbWIiFwuhRsRAcwTUkOHmteOHaFePbsrEhG5PAo3IgLA22/DggXg6wtjx9pdjYjI5VO4ERG2boWnnjLrL78M9evbW4+IyJVQuBEp5dLS4P774dQpaNcOBg60uyIRkSujcCNSyj3/vJkcMzQUZs4Eh8PuikRErozCjUgptngxTJxo1mfMgIgIe+sRESkICjcipVRKCsTEmPXHHoMOHeytR0SkoCjciJRSc+fCwYNmoL7XXrO7GhGRgqNwI1JKffyxeX3wQQgIsLUUEZECpXAjUgolJpr+NmCelBIRcScKNyKl0OzZ4HRC8+ZQs6bd1YiIFCyFG5FSKOuWVM+e9tYhIlIYFG5ESpldu2DVKvDwgO7d7a5GRKTgKdyIlDKffmpe27TRuDYi4p4UbkRKEcvSLSkRcX8KNyKlyLp1sGMH+PlBp052VyMiUjhsDzdTp04lKioKPz8/WrZsyerVqy96/LFjx+jfvz8VK1bE19eXWrVqsXDhwiKqVqRky2q16dgRgoPtrUVEpLB42fnhs2fPZsiQIUybNo2WLVsyefJk2rZty44dOwgLCzvv+PT0dG6//XbCwsL4/PPPqVy5Mn/++Sdly5Yt+uJFShinE2bNMuu6JSUi7sxhWZZl14e3bNmS5s2bM2XKFABcLheRkZEMGDCA55577rzjp02bxquvvsr27dvx9va+rM9MTk4mJCSEpKQkgvVPVylF/vc/aNsWypc30y74+NhdkYhI3uXn+9u221Lp6emsXbuWNm3anCnGw4M2bdqwcuXKXM/5+uuvadWqFf379yc8PJz69eszbtw4nE7nBT8nLS2N5OTkHIuIu3O54JVX4N57oUULCAszwQbgn/9UsBER92bbbanDhw/jdDoJDw/PsT08PJzt27fnes4ff/zBDz/8QM+ePVm4cCG7du3i8ccfJyMjg5EjR+Z6zvjx4xk9enSB1y9SnH3zDTz77PnbK1aEJ54o+npERIqS7R2K88PlchEWFsY777xD06ZN6d69O8OHD2fatGkXPGfYsGEkJSVlL/v27SvCikXsMW+eeb3rLrO+YQMcPQoHDkD9+jYWJiJSBGxruQkNDcXT05OEhIQc2xMSEoi4wMhiFStWxNvbG09Pz+xtderUIT4+nvT0dHxyaWv39fXF19e3YIsXKcacTtNyAzBkCNx6q731iIgUNdtabnx8fGjatCmxsbHZ21wuF7GxsbRq1SrXc66//np27dqFy+XK3rZz504qVqyYa7ARKY1++QUOHYKyZeHGG+2uRkSk6Nl6W2rIkCG8++67vP/++2zbto3HHnuMlJQU+vTpA0Dv3r0ZNmxY9vGPPfYYR44cYdCgQezcuZMFCxYwbtw4+vfvb9evIFLsfPWVeb3zTrjMhwpFREo0W8e56d69O4cOHWLEiBHEx8fTuHFjvvvuu+xOxnFxcXh4nMlfkZGRLFq0iCeffJKGDRtSuXJlBg0axLO59ZwUKaW+/tq8duxobx0iInaxdZwbO2icG3FnO3bANdeYFptDhyAkxO6KREQKRokY50ZECl5Wq83NNyvYiEjppXAj4kay+tvcc4+9dYiI2EnhRsRNHDoEK1aYdfW3EZHSTOFGxE188w1YFjRpApGRdlcjImIfhRsRN5HV30a3pESktFO4EXEDqalm1m/QLSkREYUbETcQGwsnT0LVqtC4sd3ViIjYS+FGxA1kPSXVsSM4HPbWIiJiN4UbkRIuPh4+/dSsd+pkaykiIsWCwo1ICffSS5CSAi1bagZwERFQuBEp0XbtgnfeMesvv6xbUiIioHAjUqK98AJkZpoZwG+6ye5qRESKB4UbkRJq7VqYPdu01owfb3c1IiLFh8KNSAn13HPm9YEHoGFDe2sRESlOFG5ESqDFi+H778HHB8aMsbsaEZHiReFGpIRxuc602jz+OERF2VqOiEixk+9wM3PmTObMmXPe9jlz5vD+++8XSFEikrvUVHj4YVi3DoKCYPhwuysSESl+8h1uxo8fT2ho6Hnbw8LCGDduXIEUJSLn+/13uO46mDkTPDxg0iTI5X9FEZFSL9/hJi4ujujo6PO2V6tWjbi4uAIpSkRy+vxzaNoUNm2CsDDT3+ahh+yuSkSkeMp3uAkLC2PTpk3nbd+4cSMVKlQokKJE5IyRI+Gf/4Tjx+HGG2H9erjlFrurEhEpvvIdbnr06MHAgQNZsmQJTqcTp9PJDz/8wKBBg7jvvvsKo0aRUmv9+jNPQz3zDPzwA1SqZG9NIiLFnVd+T3jppZfYu3cvt912G15e5nSXy0Xv3r3V50akgA0bZl7vu89MryAiIpfmsCzLupwTf//9dzZs2IC/vz8NGjSgWrVqBV1boUhOTiYkJISkpCSCg4PtLkfkgn74AW67Dby8YPt2uPpquysSEbFPfr6/891yk6VmzZrUrFnzck8XkYuwLHj2WbPer5+CjYhIfuS7z03Xrl15OZf28VdeeYV//vOfBVKUSGn3+efw669QpoyZHFOk2MhMhYwTF95vueDIWkhYAq6MoqtL5Cz5brn56aefGDVq1Hnb27dvz+uvv14QNYmUahkZZwbnGzoUwsPtrUdKsYzjkLAUjm2EY5vMcvx307QYUgcqXAehLaFsI7Mv/ntIiIW0v835fuEQHQNXPwTBtcw2V4Y59vAvkBIHZapC4NUQWB3KVANP34vXlNWTwuHIfX9qAux80wSszJPgTAXnSXCmQ+h1UO0+iLgdPH0u/fu7MiF1P1hOE9qyFk8/8CkLXkHg4WlqSt0PRzecXjZC2iFwpZvf15Vu3i/8Noh+AMo1uXD9UiDy3efG39+fDRs2ULt27Rzbt2/fTpMmTUhNTS3QAgua+txIcTdtGjz2GFx1FezebUYiFrki6Umw6z/gXwmi7gfHRRrt047A/vmw70s4uAhcafn/PK8gE1LSDp/ZdtX15vXIWnCeusCJDvCtAD7lwaecWbzKQPoROHXIBIa0wyY0RXaDavdCaCvz+5z8C7a+Crvfucj7n+ZTDiK7QsV2JqR4BoCXP3j4QNJW+HsVHF4FR3414ehSv6vDAzKS8np1ILgORPWEiDbg4X36z8NhloxkSD96ZvHwhvCbzTmlPBDl5/s73+GmRYsW3H333YwYMSLH9lGjRjF//nzWrl2b/4qLkMKNFGcpKVCjBsTHw5tvwoABdlckJZrzFOz8N/w21gQEgHLXQtM3IOyGM8e5MuHAAvj9PxC/GKzMM/sCr4bQ1lCuIYQ0MK94mADw9yrTAnNsMwTVNC0iFW+HCi3Mufu/gd3T4eC3psUji085c0xgDUj9C078Acd3mxaW/PKvbN7rwIIzLSQVWprWouzgEmB+x/3fQNxncCo+7+/v4WMWh4f5vR2O061B5wQoh6cJIOUaQbnGEBAJHr6nz/c24SduDuz/+tLh60K/Z0SbM4Ho5H5IPWBajE4lQPox8xkZSSbMeniBd8iZxe8qEwTDb4Hyzc9vucpMhbRE8K9iWqOKoUINN/Pnz6dLly7cf//93HrrrQDExsbyySef8Pnnn9OpU6fLLrwoKNyIXVauhNGjzYB8Dz4Inuf8/bF1K/TpA6tXQ3S0eULKJw8t5yLncZ6CPz+DTS/CydMjxwfVMl/qGcnm56rdoe7TcOBb06pz8q8z55dtCJFdzBJS/8pbDE7uh31zwTvY3MYKqnl+65FlwalE8wV7dstFxgnwLQ++V5kvaJ8K5jbZn5/B/q/O/D4AYTdB/RfM7Z8L1exywqGf4M9ZcGT9WbetUs0XfGC0CUehLc1tt+Baubd0OdPOBAlXGgTVMLerLiUj2bSK7f0YkncA1pnbXbhMS9DZLVfpf0Piz5fXgnYhngFw1Q2mlezEHkjZeybweQWZsHhVaxOGguuYVjiHtwlEHj4mtNnQilSo4QZgwYIFjBs3LvtR8EaNGjFy5EjKly9P/fr1L7vwoqBwI3bIzIR69WDnTvNzgwbw6qvQtq3pY/Pqqyb4pKdDSAh88YV5DFzkkk7uN60Wx7aYL8vjOyHlT+D0X+3+laHhaNP3Jf2ICTy73j2zP4tvKFTvm7N/THHnPAUH/wd/r4GKd0DYjXZXVDgyU+Hwcji4GBJ/Mi03AZXNbUb/yuBf0bRSeYecfg02LVXZLTnHTP+mxB8hcWnO24Vnc3ia/kWX4ulnwmZW4PQqA5kpZy0nTOvVDZ8V2CWAIgg3537Yp59+yvTp01m7di1OZx4ujI0UbsQO//0vPPIIlC1r/sFz9KjZfscdcPiwmeUb4K674D//gcqVbStVSoLju82//vd9CX//kvsxfmFwzVNQa4DpT3K2oxtg7WDzZRfaGmo+BlW75a3lQUo2ywVJv0HCj+A6BWWiTWtVmSgTjpJ+g8Mr4PBKs5zcZzpF5yX0nK18c2i3ukBLL5Jw89NPPzF9+nS++OILKlWqRJcuXejatSvNmze/rKKLisKNFLXUVKhZE/bvNzN59+4NY8fCW2+ZVhuAcuVMH5uePUt9n0H3ZLnMk0QZSebWiV9YPs+3zJfOvi9h3xfmaaOzhbY2txmCa5vbT8G1zL+qL/UfkyvDtAKIXIrlMv+9OE+ZW2VZHbxPHTK39bwCTQtO1qtvBQipW6AlFNogfvHx8bz33ntMnz6d5ORk7r33XtLS0pg3bx516xbsLyHiLqZONcGmalUzIJ+fH7z+Ojz+OLz0kjlm/HioWNHeOqUQWJZ58mjzSNNakqVsAwi/9XQH0Tsu/FjyqcOwY5LpiHr89zPbHZ4QdjNU7QqV74GAy5xwTMFG8srhYfreePqCT4h5dL8Yy3PLTYcOHfjpp5+466676NmzJ+3atcPT0xNvb282btxYYsKNWm6kKB07BtWrm9tQM2eajsRSzKQfg0PL4dDPpj+D5YQGo6BS+8t/z8xUSPjBhJojp58g9Qoyzf/ntroE1oAmL0OVzmdaWiwX/DETNjx7ZswYD1/TrySyC1TuYP5lLFKKFErLzbfffsvAgQN57LHHNO2CSB699poJNnXrQq9edlcjORzdBKseNmOZnNu5dumdUO1+aDrZdJi8kFOJcGiZCUfHfzf9E07uOxNIwDTR1xoIdZ4ygeTUYUhcAvGx5jbTiV3wc1czDkyT18zxq/uZfg9gWnnqPg+V7wJvDXokkhd5brn55ZdfmD59OrNnz6ZOnTr06tWL++67j4oVK6rlRiQX8fFmTqiTJ2HuXCjmoySULn+vgSVtzaPGYB5NvupGCPuHaVnZMdm0nvhWgGsnQ8W25gmklD/No9VJW01LT/KOC3+GdwjUeATqPHPhgJRxHLa9CtteOzNYnMPDfLZXGWgwBmoP0O0jEQq5Q3FKSgqzZ89mxowZrF69GqfTycSJE+nbty9BJWAoVYUbKSoDBsCUKdCypRnjRh2FC0jiz/DHDAhvA5GdzQBt+XFouWmZyUg245jcOAcCquQ85u81plXn3FtIuQmpbx5BLtvQDNwWEAllIsG7bN7/0E/uh00jzK0oLDP6btNJ59clUooV2aPgO3bsYPr06Xz44YccO3aM22+/na+//vpy365IKNxIUdi6FRo3Nk9DLVkCN99cyB/oyjT/8i8pty0sC46uNwO7XXUDVGqbh3NcsHWCGacla7RbryAzBH90jLl9c2IPnNhtRrxNPQhl65sRWctEm6CRsAR+7GDG4gj7B9z0zYWvmSvDtKpseck8IeJfEQKqnZ4LqboZ4Oyq6wu270vyDtMHKLRlwb2niJso0nFuAJxOJ/Pnz2fGjBkKN1LqOZ1w/fWwahXcfTfMn18EH/pzNziwENr8BBWaFcEHXqYTe2DvJ7D3I0jefmZ7o7FQd9iFWzpOHYKVvcxcRwAV25vzU/bk7XMDqpog8tdcE1Qibod/zMtbq4/z9Miwl5rQUUQKVZGHm5JE4UYK26RJMGQIBAfDb79BlcK+s3BkLXx3OtBcdYMJOHm5HeLKgE0jzbDuFdualowLDeJmWSZIHDo9sNeJXeaJnRqP5r0/yNoh5rHmLJ5+Zp6jrI6z1XpAy+k5B5yzLDPQ3IoHzBw6nn7Q7N9wdR/TenNoGfzxvpkvKPOEGdsla4Zpv6vM7aW/V+ecK6lyBzNyqgasEylRFG4uQuFGCtPu3WZqhdRUeOcdMypxoVvW3Xy5Z7nxS9MX5WIsC1Y9dLqPx2me/uYWTtjNJvBkD9KVCElbzOR85wqqBY1fhir3XDxQ/fUV/NTJrIffBtEPmEeavYPNZI2/PmECSIUWpv6UvfDXPHPb6sRuc15wbbhhjrn9dC5nuqk5t1tMmSmmn03CEjMvTr3hFx5XRkSKLYWbi1C4kcLicpn5oJYuhVtvhe+/L4JOxMd3wze1TCtGZFczem1gDbjrt4t/gW8aBVtGmydzqt5rxndJPXDxz/LwhnJNTF8TvzDYPtmEHzAtRk1eh9AW55+X9jcsqGfCUd1nofGE849JWGJuraUfARzkeDTbw9eEoWsng3fgxWsUEbdVaCMUi8iFvfuuCTYBAWa9SJ6O2v66CTYV28F1M81tmhO7YNc0qD0w93N2zzDBBqD52+bWkmXBsc1w8Dsz7ot38FkT44WZeWfKN815y6jWE7D1FVPDoWWwuBW0eMdMvHi2XweaYBNS1wyOl5vwW6DtatPZN3mbeYy68t1mYLuKbRVqRCRf1HIjUgD27TOzfh8/DpMnw6BBRfChpxLhq2qmg+xtSyD8Ztj1Dqz+P/ApDx13mxmCz3ZgEfx4lxmFt95waPSvK6/j5F+wboiZIgCg4b+g3vMm3e2bCz93MS1Et6/MvWXnbJknzezW5ZtobBcRySE/398eRVSTiNuyLPi//zPBpnVreOKJIvrgHW+ZYFO+uZmMEaB6X9NCkn4Efht35lhXBuybB8u6mWAT1QsavlQwdQRUgetnm6edADa9AGsHmvC1pp/ZVufZSwcbME8vhbZQsBGRK6KWG5Er9N570KcP+PrChg1wzTVF8KEZJ+CrqmaE3Rs+NxMoZtm/0LTOePhAqw8hIRbiPj/dnwXToffmhYXTqXbHm7B2MGCBbyikHYaQetBurR6lFpEroj43IkVk/34YPNisjxlTRMEGYPe7JtgE1YQqnXLuq9TeBJiEWFje/cx2vzAzX1LD0YX3tFDtgeAXbsakSTtsZq++7j0FGxEpUgo3Ipcp63ZUUhK0aGHGtsm3lD/Na5lqeT/HlQHbJ5r1OkPBwzPnfocDrp0Ii1ub1pvIrlDtPnPryqMI/pev1t202qwfClc/XLwHFRQRt6RwI3KZPvoIFiwAHx+YORO88vN/06nDsHmUearJ4QWtP4Sq/8zbuX99ZTrx+oVDdO/cjynXEDrHmxYTO/qvRNwG7dcX/eeKiKAOxSKX5eBBGHj6SetRo6Bu3Tye6EyHbRNhfg34farp3OtKg2X3mpmh89IF7sC35jWq58VH2fUOVMdcESmVFG5E8inrdtSxY9C0KTz9dB5OSNoOW181g9mtfwoykqBcY7j1e6g1wBy3/mn4dQC4nBd/r/j/mfWKeZhsUkSkFNJtKZF8mjfPTIbp7X2R21HOdDj0M+yfD/u/OTOFAIBfhJkoMjrG9JcJvxUCo2HdU6Y152QcXP8peJU5/32Tt5tbUh6+cNWNhfUrioiUaAo3IvmQlgZDh5r1p58280hlO3XYzMx94Bsze3VG8pl9Hj5mFN7KHUw/mbPnQHI44JonzczVKx8wgWjDMGj25vkFZM2KHfaPnKMFi4hINoUbkXx46y344w+IiIBhw87asWUsbB5hpkLI4hcOle40gSbi9ktPIVC1q3l0+ufOsPcjaPLq+Y9QH8y6JXVHgfw+IiLuSOFGJI8SE+Gl04P6jh8PgVlZ5c/ZZlRegLKNTJip3ME8Au3IZ7e2yh3Av5KZxPLAtxDZ6cw+ZxokLjXrEQo3IiIXog7FInk0YgQkJ8O110LvrCewj26EX/qa9TpPw50boNFLZgqB/AYbMH1wou4363s/yrnv0HJwppoWobINzj9XREQAhRuRPNm82cz0DWZiTA8PIO1v+KkzOE+alpRG4wvmw6IeMK/755tRiLNkPSUVcUcRTTkuIlIyFYtwM3XqVKKiovDz86Nly5asXr06T+fNmjULh8NBp06dCrdAKdUsC558Elwu6NYNbrwRcGXC8h6QsgcCq5unm84dKfhylWtkWmZc6WZOqCzqbyMikie2h5vZs2czZMgQRo4cybp162jUqBFt27YlMTHxouft3buXoUOHcuONehxWCtc330BsrBmJ+JVXMMFm/TMQvxg8A+Af88C3fMF+aFbrTdatqVOJcPT0iL8RbQr2s0RE3Izt4WbixIk88sgj9OnTh7p16zJt2jQCAgKYMWPGBc9xOp307NmT0aNHU7169SKsVkqbY8dgwADw9znJf0fNIzo+Br4Mhx2TzAGt3iuc/i9R9wMOSPwJTuyF+O/N9rKNwD+i4D9PRMSN2Bpu0tPTWbt2LW3anPmXqIeHB23atGHlypUXPG/MmDGEhYXx0EMPXfIz0tLSSE5OzrGI5IVlQb9+0LnOJP7+Tyi9qnWGPR9A+hHwrQDXTs77fFD5FVDFjIsD8OcnuiUlIpIPtj4KfvjwYZxOJ+Hh4Tm2h4eHs3379lzPWbZsGdOnT2fDhg15+ozx48czevToKy1VSqGZM+HzOZkkvv0S/j6pUCYKqnQyy1XXF/4M21EPQMIPsOdDM10DaMoFEZE8sP22VH4cP36cXr168e677xIaGpqnc4YNG0ZSUlL2sm/fvkKuUtzBjh3mdlTrWisoH3gUfMpDh13QdBKE31T4wQbMoH6efmbKhdSD4OlvQpWIiFyUrS03oaGheHp6kpCQkGN7QkICERHn9yvYvXs3e/fupUOHDtnbXC4zIqyXlxc7duzg6quvznGOr68vvr7njPIqchFpaXDffXDyJPS/5xuzsdKdBfc0VF55B0PleyButvk57KaLzwIuIiKAzS03Pj4+NG3alNjY2OxtLpeL2NhYWrVqdd7x11xzDZs3b2bDhg3ZS8eOHbnlllvYsGEDkZGRRVm+uKlhw2DDBggNhS7XnQ43lTtc9JxCE/3AmXX1txERyRPbp18YMmQIMTExNGvWjBYtWjB58mRSUlLo06cPAL1796Zy5cqMHz8ePz8/6tevn+P8smXLApy3XeRyLFoEk04/CDV7+m68T2wDh5d9waJiWzMdw6kE03okIiKXZHu46d69O4cOHWLEiBHEx8fTuHFjvvvuu+xOxnFxcXh4lKiuQVJCHTkCfU/PpPDEE3BrrW9gHRB2I/iUtacoD29o8yOkHYbg2vbUICJSwjgsy7LsLqIoJScnExISQlJSEsHBwXaXI8XI/ffDp5/CNdfAunXgv/J2M77MtRPhmiftLk9EpFTLz/e3mkREgNmzTbDx9IQPPgB/r2RI/NHsrHS3vcWJiEi+KNxI6bbnY44vG86A/hkAvPACNG+OGTTPlQFBtSC4pr01iohIvtje50bENif+wPrlQYKsTIbekcFnO19h+PDT+/bPN692PSUlIiKXTeFGSq9No3BYmQA8c/er9Kh+E97ed4HLCQcWmmMq65aUiEhJo9tSUjod+w3r9IzbC9abR6wj98dAyj74e7V5Osk7RCMCi4iUQAo3UjptHoEDi89Xd+XlFV9ilWsKaX/Dih7w11xzTMV25lFsEREpUXRbSkqfv3+FfV/icjkY9cUYPprvi6PGZ/BtEzi0HA6fnpFe/W1EREoktdxIqePa8AIAHy1/gNu61KVxYyCwOrScbg6wXODwgErtbKtRREQun8KNlC6JP+ORsIiMTC+m/jSKMWPO2le1G9Tsb9avuhF8K9hRoYiIXCHdlpLSw7I4tep5/ID/Ln2Ygc9XJyTknGOaToIKzcwM3CIiUiIp3EjpkJ4EW8fjd3wZqel+/JDwAp/dn8txHt5Q/cGirk5ERAqQwo24t8yTsPMt2PoypB8F4PWFTzP61co4HDbXJiIihULhRtzXH+/BhmFwKh6AHQfrMGzWv6h1W2fq1rW3NBERKTzqUCzuadtr8EsfOBWPFRDFmMXvU/fpzfzl6MKYMWqyERFxZwo34n62T4b1T5v1es/z/ModjHyvN0HBnsyeDT4+tlYnIiKFTLelxL3smALrnjTr9UewYN9oJrxifpwxA6Kj7StNRESKhsKNuI/f34a1A8x6vefZV3YUvW8xPz7xBHTpYl9pIiJSdBRuxD3sngFrHjfrdZ7BWe9f3H+LgyNH4Npr4bXX7C1PRESKjvrcSMn311ew+hGzfs0QaDyB/7zjYNkyCAqCzz4DX197SxQRkaKjcCMlW+LPsPw+Mx/U1Q9Bk9c4GO9g2DCze9w4uPpqe0sUEZGipXAjJdfRTfBjB3Cegsodofk0cDgYPBiSk6FZM3jsMbuLFBGRoqZwIyXTiT2wpC1kJMFVN8D1s8DDi+++M7ehPDzgnXfA09PuQkVEpKgp3EjJk5pggs2peAipDzd9DV7+nDwJj5/uUzxoEDRpYm+ZIiJiD4UbKVnSj8HSdnD8dyhTDW5ZBD7lAHjpJdizByIjYcwYe8sUERH7KNxIyZF50vSxOboB/MLglsUQUAmAjRvPPO49ZQoEBtpXpoiI2EvhRkoGZzr83A0OLQPvENNiE1wTgCVL4JZbIDMTOnWCjh3tLVVEROylcCPFn8sJv8TAwW/B0x9u+gbKNQbg3Xfhjjvg6FFo2dJ0IhYRkdJN4UaKv3VPwp+zwOEFN34BYTfgdMKTT8Kjj5oWmx49YOlSuOoqu4sVERG7afoFKd52TIGdb5n1Vh9CpfZkZEDXrjB/vtk8Zgy88AI4HPaVKSIixYfCjRRfB76FdYPMeqPxEHUfYJ6Kmj8f/Pzg/ffh3nttrFFERIod3ZaS4unYFljW3UyrUL0P1H0WgGXLYOxYc8h77ynYiIjI+RRupPhJTYAf74bM4xB2U/a0CklJ0KsXuFzQuzd07253oSIiUhwp3EjxknYEfroHUv6EoJqmA7GnDwBPPAF790J0NLz1lr1liohI8aU+N1J8JPwIKx+Ak3+ZUYdv+gZ8KwDw6afw0UdmzqiPPoLgYJtrFRGRYkstN2I/VyZsGgE/3GqCTVBNuDUWgmsB8OefZ2b3fvFFaN3axlpFRKTYU8uN2CtlHyy/Dw6vMD9X7wNN3wRvM3+CZcHDD0NSElx3nXnkW0RE5GIUbsReK+43wcY7GJr/J/tx7yyzZsH334OvL3z4IXjpv1gREbkEfVWIfU7sMXNFOTyg7Zrs21BZjh0zoxCDabGpUaPoSxQRkZJHfW7EPnFzzGvYzecFG4Dnn4eEBKhdG55+umhLExGRkkvhRuzz52zzWu38AWtWrYJp08z6tGnmtpSIiEheKNyIPY7vgqPrwOEJVbrk2JWZCf36mc7EvXvDzTfbU6KIiJRMCjdij7jPzGv4beAXmmPXlCmwYQOUKwevvlr0pYmISMmmcCP2yL4llXNyqLg4M5YNwMsvQ1hYEdclIiIlnsKNFL2k7XBsEzi8oErn7M0uF/TtCydOmIH6HnrIxhpFRKTEUriRopd1SyridvAtn7353/+G2Fjw9zczfnvov04REbkM+vqQopcVbs56SmrnTnjmGbP+yitQs6YNdYmIiFtQuJGidew3SPoNPHygyj0AOJ0QEwOpqXDbbfD44zbXKCIiJZrCjRStrFabim3Bpyxgnoj65Rcz0/fMmbodJSIiV0ZfI1J0LAviTj8lVdXcktq0CUaMMJvefBMiI22qTURE3IbmlpKikZkKv0+F5B3g4QtVOpCcDPfdBxkZcM89ZsA+ERGRK6VwI4UrIxl2/ht2TIJTiWZbVE9cnsE88ABs2waVKsF//gMOh72lioiIe1C4kcKzeyasexIykszPZaKg7jNQvS8vvgjz55s5o+bNg/BwOwsVERF3onAjhSM1Htb8H7gyILgO1BsG1e4DD29mz4Zx48xh//0vNG9ub6kiIuJeFG6kcOx6xwSbCi3hjhXgMH3X162DPn3MIUOHwgMP2FijiIi4JT0tJQXPmQ6/v23Waw/ODjaJidCpkxnPpl07mDDBtgpFRMSNKdxIwYubA6fiwb8SVO0KmCei7r0X9u2DWrXg00/B09PmOkVExC0p3EjB2/mmea35GHh4A2ZqhR9/hMBA04G4bFnbqhMRETdXLMLN1KlTiYqKws/Pj5YtW7J69eoLHvvuu+9y4403Uq5cOcqVK0ebNm0uerwUscOr4O/VZnqFGo8C8PHHMHmy2f3BB1Cnjn3liYiI+7M93MyePZshQ4YwcuRI1q1bR6NGjWjbti2JiYm5Hr906VJ69OjBkiVLWLlyJZGRkdxxxx3s37+/iCuXXO14w7xW6wF+YWzYAI88YjYNHw6dO9tWmYiIlBIOy7IsOwto2bIlzZs3Z8qUKQC4XC4iIyMZMGAAzz333CXPdzqdlCtXjilTptA7D0PcJicnExISQlJSEsHBwVdcv5zl5AH4qhpYmdBuLX9b19KsGezdazoQf/ON+tmIiMjlyc/3t60tN+np6axdu5Y2bdpkb/Pw8KBNmzasXLkyT+9x8uRJMjIyKF++fK7709LSSE5OzrFIIdk1zQSbq27AKnctvXqZYFO9OnzyiYKNiIgUDVvDzeHDh3E6nYSfMzxteHg48fHxeXqPZ599lkqVKuUISGcbP348ISEh2UukZmYsHM40+H2aWa89kPfeg2+/BT8/mDsXypWztToRESlFbO9zcyUmTJjArFmzmDt3Ln5+frkeM2zYMJKSkrKXffv2FXGVpcSeDyDtEARU4aBnJ4YMMZvHjIGGDe0tTUREShdbRygODQ3F09OThISEHNsTEhKIiIi46LmvvfYaEyZM4Pvvv6fhRb49fX198fX1LZB65QLSk2DTC2b9miE8MdCbY8egaVN48klbKxMRkVLI1pYbHx8fmjZtSmxsbPY2l8tFbGwsrVq1uuB5r7zyCi+99BLfffcdzZo1K4pS5WI2jzIzfgfX5sst/fnyS/DyghkzzKuIiEhRsv2rZ8iQIcTExNCsWTNatGjB5MmTSUlJoc/pCYh69+5N5cqVGT9+PAAvv/wyI0aM4JNPPiEqKiq7b05gYCCBgYG2/R6l1rHfYOdbACTXepPH/+EDwLBhuh0lIiL2sD3cdO/enUOHDjFixAji4+Np3Lgx3333XXYn47i4ODw8zjQwvf3226Snp9OtW7cc7zNy5EhGjRpVlKWLZcHagWA5oUonBo67g4QEM0jf8OF2FyciIqWV7ePcFDWNc1OA4j6HZf8ETz/+572Vtl2jcThg+XK4yF1FERGRfMvP97ftLTdSQmWehHVPAbA/+Bk6dY0GYPBgBRsREbGXwo1cmjMNDiwwT0XhAssFiT/DyTgyfKrS6qFnSU2F9u3h5ZftLlZEREo7hRu5OGc6LG0PCUty3T34g4nsOxhA06bw2Wfg7V3E9YmIiJxD4UYuzLJgVV8TbLwCIewfgAc4PMh0Ovjvl8349/wuREfDggWgh9VERKQ4ULiRC9s4HPZ+DA5PuOFzqNQWAJcLunaGr7+GChXMNAvnzKAhIiJimxI9/YIUot+nwVYzthAt3s0ONgBjx5pg4+dnXmvXtqlGERGRXCjcyPn+mg+/9jfrDUbB1X2yd/3vfzBypFmfNg1aty768kRERC5G4UZyOrkfVvQwT0RV7wv1R2TviouD++83XXEefRRiYmysU0RE5AIUbiSnLf+CzBQIbQUtpoHDAUB6Otx7L/z9N1x7Lbzxhs11ioiIXIDCjZxxYg/s/q9ZbzwBPM481/3UU7BqFZQrB59/bvrbiIiIFEcKN3LGljFgZULEHacf+zZmzYIpU8z6hx9CdLRN9YmIiOSBwo0YyTtgzwdmveFL2Zv/+MP0rwEzGeZdd9lQm4iISD4o3IixaaTpRFzlHghtAUBGBvToAcePww03gCZdFxGRkkDhRuDoJoibbdYbjMne/OKLsHo1lC0LH38MXhryUURESgCFG4HNpx/3rtodyjUEYPHiM5NgTp8OVavaVJuIiEg+KdyUdodXw19fgcMDGo4GIDERevc2u/v1gy5dbKxPREQknxRuSrudb5rXqF4QXBvLgj59ID4e6tWDiRPtLU9ERCS/FG5Ku6PrzWu17gD8/DMsXAi+vuYRcH9/G2sTERG5DAo3pZkrA5J3mvWQegD89/QYfg88APXr21SXiIjIFVC4Kc2O/24G7fMKgoBIjh6FOXPMrkcesbc0ERGRy6VwU5ol/WZeQ+qCw8HHH8OpU9CgAbRoYW9pIiIil0vhpjQ7lhVu6mFZ8O675seHH86eL1NERKTEUbgpzc5qufn1V9i0yXQkfuABe8sSERG5Ego3pVnSmZabrFabbt2gfHn7ShIREblSCjellTPddCgGUrzr8emnZrM6EouISEmncFNaHd9pnpTyDmbW11U4cQJq1oR//MPuwkRERK6Mwk1plXVLKrgu775reg+rI7GIiLgDhZvS6nS4OeKqx6pVZsbvmBibaxIRESkACjelkGVBUpwJN//+2IxM3LEjhIfbWZWIiEjBULgpRTIzYexYqF0bDm434eanTfUICoLnn7e5OBERkQLiZXcBUnSefdbM8u3jlUaN8F0APPZcPT6/G4KDbS5ORESkgKjlxp0d3Qg7p4Ll4oMPTLABmDF5B16eTvAOpnOPSgo2IiLiVtRy466StsP3N0FGErv/LMOjjz4IwIsvQs+7tsIKzEzgejxKRETcjFpu3FHaEfixA2QkAXDs12mkpcE998CoUeQYmVhERMTdKNy4G1cGLLsXTuzC8o8kw+lN02qr6HLLRj78EDw8ULgRERG3pnDjbtYOhoRY8CrDmJ++Ye6aTgDMeP4/BAWdPkbhRkRE3JjCjTvZ+W/4/d+Ag7V+nzBqckPeWfJ/AIQc+QgyToDzFJwwT0op3IiIiDtSuHEXf6+BtQMBSL1mPJ36dwSgwW23QGANyDwOcbMheQdYLvAuC/4VbSxYRESkcCjcuItNI8FyQmQ3Bk17hr/+gurV4V9jPaDGo+aY3/9z5pZUWT0pJSIi7knhxh38/Ssc/BYcHixPGZ89EeaMGVCmDFD9QfDwgSNrYM9H5hzdkhIRETelcOMOtrwEQEblntz/fzUA6N8fbrrp9H6/qyCyi1k/+K15Da5bxEWKiIgUDYWbku7oBtj/NeBg7FfDiYuDqCiYMOGc47JuTWUpq5YbERFxTwo3JZy1+V8A/BzXndETawMwfToEBp5zYNjNEFTrzM+6LSUiIm5K4aaEOnoU3ntjC46/vgCg35QXADM55q235nKCw3Gm9canHPhFFFGlIiIiRUvhpgTauBEaNgTf38cC8NW6rtzauR5btuRyO+psVz8Mle6GesP1pJSIiLgth2VZlt1FFKXk5GRCQkJISkoiuAROh/3tt3DvvVA5aDtbX6mLh4fFyZvWE1C5sd2liYiIFJr8fH+r5aYEefttuPtui/oRK5k15DE8PCyo3FHBRkRE5Cxedhcgl+Z0wrgX9pG69UO2vvw+tSvtNDscXtBghL3FiYiIFDMKN8WRMx2ObYLDv3Bq/y/8vXMVLzbYBQ3MbsszAEfVblDzcSjf1N5aRUREihmFG7tZLoiPhaPrTaA5tgmStoGVCYAfUPn0rcUEbib8uhgckV3BO+jC7ykiIlKKKdzYyZkOy++Fv746b9dJZ3l+3NKSlb9fR3xGS578VwvqNCpnQ5EiIiIli8KNXVwZsLy7CTYevhDZmb+dDflpc0Omf9GABUsiAQcxMTB16uk5okREROSSFG7s4MqA5ffBX/Nw4stHe7/i9XFt2bz5zCH+/vDvf8ODD9pWpYiISImkcFNYMk/CgW/N3E/BtXGVvZZNe2vz048uWmTez3WVviQtw4dOk+by3ca2AHh6ws03wz33QNeuUKmSrb+BiIhIiaRwU5AyTsCBhRA3B+vAQhzOk9m7PIBaaf4EE0H1SntIy/Ch86S57EppT48ecOedZilf3r7yRURE3IHCTUH5az7WsntxuE4B4AD2JEbx4/abqBG+i8bVNhDol0L1sD04LW+2hX7Bx0vupJz6CIuIiBQohZsCsmh1Y9q6TvF7fA0+X92Nz1d1Y2v8tdx4o4Nbo8C7rpOmtXbhdXwDnkE1aKzxaURERApFsZh+YerUqURFReHn50fLli1ZvXr1RY+fM2cO11xzDX5+fjRo0ICFCxcWUaUXVr9lJLWe2kG393dyJHI8E95pypEjDv73P3juOWh5nSde5WtDte4aeE9ERKQQ2R5uZs+ezZAhQxg5ciTr1q2jUaNGtG3blsTExFyPX7FiBT169OChhx5i/fr1dOrUiU6dOrFly5YirjynypVh+aZabNzo4NVX4fbbzRNPIiIiUrRsnxW8ZcuWNG/enClTpgDgcrmIjIxkwIABPPfcc+cd3717d1JSUvjmm2+yt1133XU0btyYadOmXfLzSvqs4CIiIqVRiZkVPD09nbVr19KmTZvsbR4eHrRp04aVK1fmes7KlStzHA/Qtm3bCx6flpZGcnJyjkVERETcl63h5vDhwzidTsLDw3NsDw8PJz4+Ptdz4uPj83X8+PHjCQkJyV4iIyMLpngREREplmzvc1PYhg0bRlJSUvayb98+u0sSERGRQmTro+ChoaF4enqSkJCQY3tCQgIRERG5nhMREZGv4319ffH19S2YgkVERKTYs7XlxsfHh6ZNmxIbG5u9zeVyERsbS6tWrXI9p1WrVjmOB1i8ePEFjxcREZHSxfZB/IYMGUJMTAzNmjWjRYsWTJ48mZSUFPr06QNA7969qVy5MuPHjwdg0KBB3HTTTbz++uvcddddzJo1i19//ZV33nnHzl9DREREignbw0337t05dOgQI0aMID4+nsaNG/Pdd99ldxqOi4vDw+NMA1Pr1q355JNPeOGFF3j++eepWbMm8+bNo379+nb9CiIiIlKM2D7OTVHTODciIiIlT4kZ50ZERESkoCnciIiIiFtRuBERERG3onAjIiIibkXhRkRERNyK7Y+CF7Wsh8M0gaaIiEjJkfW9nZeHvEtduDl+/DiAJtAUEREpgY4fP05ISMhFjyl149y4XC4OHDhAUFAQDofjst8nOTmZyMhI9u3bp/FyCpmuddHRtS5aut5FR9e66BTWtbYsi+PHj1OpUqUcg/vmptS13Hh4eFClSpUCe7/g4GD9j1JEdK2Ljq510dL1Ljq61kWnMK71pVpssqhDsYiIiLgVhRsRERFxKwo3l8nX15eRI0fi6+trdyluT9e66OhaFy1d76Kja110isO1LnUdikVERMS9qeVGRERE3IrCjYiIiLgVhRsRERFxKwo3IiIi4lYUbi7T1KlTiYqKws/Pj5YtW7J69Wq7Syrxxo8fT/PmzQkKCiIsLIxOnTqxY8eOHMecOnWK/v37U6FCBQIDA+natSsJCQk2VeweJkyYgMPhYPDgwdnbdJ0L1v79+3nggQeoUKEC/v7+NGjQgF9//TV7v2VZjBgxgooVK+Lv70+bNm34/fffbay4ZHI6nbz44otER0fj7+/P1VdfzUsvvZRjLiJd68vz008/0aFDBypVqoTD4WDevHk59ufluh45coSePXsSHBxM2bJleeihhzhx4kThFGxJvs2aNcvy8fGxZsyYYf3222/WI488YpUtW9ZKSEiwu7QSrW3bttbMmTOtLVu2WBs2bLDuvPNOq2rVqtaJEyeyj+nXr58VGRlpxcbGWr/++qt13XXXWa1bt7ax6pJt9erVVlRUlNWwYUNr0KBB2dt1nQvOkSNHrGrVqlkPPvigtWrVKuuPP/6wFi1aZO3atSv7mAkTJlghISHWvHnzrI0bN1odO3a0oqOjrdTUVBsrL3nGjh1rVahQwfrmm2+sPXv2WHPmzLECAwOtN954I/sYXevLs3DhQmv48OHWl19+aQHW3Llzc+zPy3Vt166d1ahRI+uXX36xfv75Z6tGjRpWjx49CqVehZvL0KJFC6t///7ZPzudTqtSpUrW+PHjbazK/SQmJlqA9eOPP1qWZVnHjh2zvL29rTlz5mQfs23bNguwVq5caVeZJdbx48etmjVrWosXL7Zuuumm7HCj61ywnn32WeuGG2644H6Xy2VFRERYr776ava2Y8eOWb6+vtann35aFCW6jbvuusvq27dvjm1dunSxevbsaVmWrnVBOTfc5OW6bt261QKsNWvWZB/z7bffWg6Hw9q/f3+B16jbUvmUnp7O2rVradOmTfY2Dw8P2rRpw8qVK22szP0kJSUBUL58eQDWrl1LRkZGjmt/zTXXULVqVV37y9C/f3/uuuuuHNcTdJ0L2tdff02zZs345z//SVhYGE2aNOHdd9/N3r9nzx7i4+NzXO+QkBBatmyp651PrVu3JjY2lp07dwKwceNGli1bRvv27QFd68KSl+u6cuVKypYtS7NmzbKPadOmDR4eHqxatarAayp1E2deqcOHD+N0OgkPD8+xPTw8nO3bt9tUlftxuVwMHjyY66+/nvr16wMQHx+Pj48PZcuWzXFseHg48fHxNlRZcs2aNYt169axZs2a8/bpOhesP/74g7fffpshQ4bw/PPPs2bNGgYOHIiPjw8xMTHZ1zS3v1N0vfPnueeeIzk5mWuuuQZPT0+cTidjx46lZ8+eALrWhSQv1zU+Pp6wsLAc+728vChfvnyhXHuFGymW+vfvz5YtW1i2bJndpbidffv2MWjQIBYvXoyfn5/d5bg9l8tFs2bNGDduHABNmjRhy5YtTJs2jZiYGJurcy+fffYZH3/8MZ988gn16tVjw4YNDB48mEqVKulalzK6LZVPoaGheHp6nvfkSEJCAhERETZV5V6eeOIJvvnmG5YsWUKVKlWyt0dERJCens6xY8dyHK9rnz9r164lMTGRa6+9Fi8vL7y8vPjxxx9588038fLyIjw8XNe5AFWsWJG6devm2FanTh3i4uIAsq+p/k65ck8//TTPPfcc9913Hw0aNKBXr148+eSTjB8/HtC1Lix5ua4REREkJibm2J+ZmcmRI0cK5dor3OSTj48PTZs2JTY2Nnuby+UiNjaWVq1a2VhZyWdZFk888QRz587lhx9+IDo6Osf+pk2b4u3tnePa79ixg7i4OF37fLjtttvYvHkzGzZsyF6aNWtGz549s9d1nQvO9ddff96QBjt37qRatWoAREdHExERkeN6Jycns2rVKl3vfDp58iQeHjm/1jw9PXG5XICudWHJy3Vt1aoVx44dY+3atdnH/PDDD7hcLlq2bFnwRRV4F+VSYNasWZavr6/13nvvWVu3brUeffRRq2zZslZ8fLzdpZVojz32mBUSEmItXbrUOnjwYPZy8uTJ7GP69etnVa1a1frhhx+sX3/91WrVqpXVqlUrG6t2D2c/LWVZus4FafXq1ZaXl5c1duxY6/fff7c+/vhjKyAgwProo4+yj5kwYYJVtmxZ66uvvrI2bdpk3XPPPXo8+TLExMRYlStXzn4U/Msvv7RCQ0OtZ555JvsYXevLc/z4cWv9+vXW+vXrLcCaOHGitX79euvPP/+0LCtv17Vdu3ZWkyZNrFWrVlnLli2zatasqUfBi5u33nrLqlq1quXj42O1aNHC+uWXX+wuqcQDcl1mzpyZfUxqaqr1+OOPW+XKlbMCAgKszp07WwcPHrSvaDdxbrjRdS5Y8+fPt+rXr2/5+vpa11xzjfXOO+/k2O9yuawXX3zRCg8Pt3x9fa3bbrvN2rFjh03VllzJycnWoEGDrKpVq1p+fn5W9erVreHDh1tpaWnZx+haX54lS5bk+vdzTEyMZVl5u65///231aNHDyswMNAKDg62+vTpYx0/frxQ6nVY1llDN4qIiIiUcOpzIyIiIm5F4UZERETcisKNiIiIuBWFGxEREXErCjciIiLiVhRuRERExK0o3IiIiIhbUbgRERERt6JwIyKlnsPhYN68eXaXISIFROFGRGz14IMP4nA4zlvatWtnd2kiUkJ52V2AiEi7du2YOXNmjm2+vr42VSMiJZ1abkTEdr6+vkRERORYypUrB5hbRm+//Tbt27fH39+f6tWr8/nnn+c4f/Pmzdx66634+/tToUIFHn30UU6cOJHjmBkzZlCvXj18fX2pWLEiTzzxRI79hw8fpnPnzgQEBFCzZk2+/vrrwv2lRaTQKNyISLH34osv0rVrVzZu3EjPnj2577772LZtGwApKSm0bduWcuXKsWbNGubMmcP333+fI7y8/fbb9O/fn0cffZTNmzfz9ddfU6NGjRyfMXr0aO699142bdrEnXfeSc+ePTly5EiR/p4iUkAKZa5xEZE8iomJsTw9Pa0yZcrkWMaOHWtZlmUBVr9+/XKc07JlS+uxxx6zLMuy3nnnHatcuXLWiRMnsvcvWLDA8vDwsOLj4y3LsqxKlSpZw4cPv2ANgPXCCy9k/3zixAkLsL799tsC+z1FpOioz42I2O6WW27h7bffzrGtfPny2eutWrXKsa9Vq1Zs2LABgG3bttGoUSPKlCmTvf/666/H5XKxY8cOHA4HBw4c4LbbbrtoDQ0bNsxeL1OmDMHBwSQmJl7uryQiNlK4ERHblSlT5rzbRAXF398/T8d5e3vn+NnhcOByuQqjJBEpZOpzIyLF3i+//HLez3Xq1AGgTp06bNy4kZSUlOz9y5cvx8PDg9q1axMUFERUVBSxsbFFWrOI2EctNyJiu7S0NOLj43Ns8/LyIjQ0FIA5c+bQrFkzbrjhBj7++GNWr17N9OnTAejZsycjR44kJiaGUaNGcejQIQYMGECvXr0IDw8HYNSoUfTr14+wsDDat2/P8ePHWb58OQMGDCjaX1REioTCjYjY7rvvvqNixYo5ttWuXZvt27cD5kmmWbNm8fjjj1OxYkU+/fRT6tatC0BAQACLFi1i0KBBNG/enICAALp27crEiROz3ysmJoZTp04xadIkhg4dSmhoKN26dSu6X1BEipTDsizL7iJERC7E4XAwd+5cOnXqZHcpIlJCqM+NiIiIuBWFGxEREXEr6nMjIsWa7pyLSH6p5UZERETcisKNiIiIuBWFGxEREXErCjciIiLiVhRuRERExK0o3IiIiIhbUbgRERERt6JwIyIiIm7l/wES9cW6+ttubgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoch = [i+1 for i in range(num_epochs)]\n",
    "plt.plot(epoch, train_acc, color='blue', label='train_acc')\n",
    "plt.plot(epoch, test_acc, color='orange', label='test_acc')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Acc')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "55a5a9d6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:49:56.127653Z",
     "start_time": "2024-06-06T09:49:56.038145Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGwCAYAAACHJU4LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8K0lEQVR4nO3dd3hUVeL/8c+kAiGFloRIKC5IB5FmxF0LiCDLIuquIgqoi4sCgi6rIgKW1aD+RBEVVBQbgoKAWICliYLSCYIColSFgIjJJJQAyfn9cb8JCTUJkzlT3q/nuc/czEyGTy4+5OO5557rMsYYAQAA+KAQ2wEAAADOhKICAAB8FkUFAAD4LIoKAADwWRQVAADgsygqAADAZ1FUAACAzwqzHeB85OXlaffu3YqOjpbL5bIdBwAAFIMxRllZWUpKSlJIyNnHTPy6qOzevVvJycm2YwAAgFLYtWuXatSocdb3+HVRiY6OluT8oDExMZbTAACA4nC73UpOTi74PX42fl1U8k/3xMTEUFQAAPAzxZm2wWRaAADgsygqAADAZ1FUAACAz/LrOSoAgMCUm5urY8eO2Y6BUgoPD1doaKhHPouiAgDwGcYYpaenKyMjw3YUnKe4uDglJiae9zpnFBUAgM/ILynx8fGqUKECi3n6IWOMDh06pH379kmSqlevfl6fR1EBAPiE3NzcgpJSpUoV23FwHsqXLy9J2rdvn+Lj48/rNBCTaQEAPiF/TkqFChUsJ4En5P89nu9cI4oKAMCncLonMHjq75GiAgAAfBZFBQAA+CyKCgAAPqR27dp68cUXPfJZX375pVwul19f7s1VP2fw1VdSs2ZSXJztJAAAX3fllVfq4osv9kjBWLlypaKios4/VIBgROU0XntNuuoq6Y47JGNspwEA+DtjjI4fP16s91arVo0rnwqhqJxGy5ZSWJg0c6b0//6f7TQAELyMkQ4e9P5Wkv9J7dOnjxYvXqwxY8bI5XLJ5XLp7bfflsvl0uzZs9WyZUtFRkZqyZIl+vnnn9WtWzclJCSoYsWKat26tebPn1/k804+9eNyuTRhwgR1795dFSpUUL169TRr1qxSH9OPP/5YjRs3VmRkpGrXrq3nn3++yOuvvvqq6tWrp3LlyikhIUE33XRTwWvTpk1T06ZNVb58eVWpUkUdOnTQwYMHS52lWIwfy8zMNJJMZmamxz973DhjJGNCQ4358kuPfzwA4CSHDx82P/zwgzl8+HDBc9nZzr/F3t6ys4ufOyMjw6SkpJi+ffuaPXv2mD179pj58+cbSaZZs2bmf//7n/npp5/M77//btLS0sz48ePN+vXrzY8//mgeffRRU65cObNjx46Cz6tVq5Z54YUXCr6WZGrUqGE++OADs2XLFnPfffeZihUrmt9///2c2RYtWmQkmT/++MMYY8yqVatMSEiIeeKJJ8zmzZvNxIkTTfny5c3EiRONMcasXLnShIaGmg8++MBs377drFmzxowZM8YYY8zu3btNWFiYGT16tNm2bZv57rvvzCuvvGKysrKK/feZryS/vykqZ5CXZ8xttzn/wSYkGLN7t8f/CABAIf5aVIwx5oorrjCDBg0q+Dq/IMycOfOc39u4cWMzduzYgq9PV1QeffTRQsck20gys2fPPudnn1xUbr31VnPNNdcUec9//vMf06hRI2OMMR9//LGJiYkxbrf7lM9avXq1kWS2b99+zj/XGM8VFU79nIHLJY0fLzVuLO3dK91yi1TM04sAAA+pUEHKzvb+5qkpIq1atSrydXZ2toYMGaKGDRsqLi5OFStW1MaNG7Vz586zfk6zZs0K9qOiohQTE1NwL52S2Lhxo9q1a1fkuXbt2mnLli3Kzc3VNddco1q1aunCCy/U7bffrkmTJunQoUOSpObNm6t9+/Zq2rSp/v73v+uNN97QH3/8UeIMJUVROYuoKOnjj6XoaOcqoEcesZ0IAIKLy+X8W+ztzVOL45589c6QIUM0Y8YMPf300/r666+Vlpampk2b6ujRo2f9nPDw8JOOi0t5eXmeCVlIdHS01qxZo8mTJ6t69eoaMWKEmjdvroyMDIWGhmrevHmaPXu2GjVqpLFjx6p+/fratm2bx3MURlE5h/r1pbfecvafe07q21fyQoEEAPiRiIgI5ebmnvN9S5cuVZ8+fdS9e3c1bdpUiYmJ2r59e9kH/D8NGzbU0qVLT8l00UUXFdw4MCwsTB06dNCzzz6r7777Ttu3b9fChQslOQWpXbt2evzxx7V27VpFRERoxowZZZqZolIMN90kPfaYsz9hgtSokTPSwqXLAADJuVJn+fLl2r59u/bv33/G0Y569epp+vTpSktL07p163TrrbeWycjImfz73//WggUL9OSTT+rHH3/UO++8o5dffllD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GjU89nkxMTH8R+8lHGvv4Vh7D8fauzje3lMWx/pcIyn5mEwLAAB8FkUFAAD4LIqKpMjISI0cOVKRkZG2owQ8jrX3cKy9h2PtXRxv7/GFY+3Xk2kBAEBgY0QFAAD4LIoKAADwWRQVAADgsygqAADAZ1FUJL3yyiuqXbu2ypUrp7Zt22rFihW2I/m11NRUtW7dWtHR0YqPj9f111+vzZs3F3nPkSNH1L9/f1WpUkUVK1bUjTfeqL1791pKHDhGjRoll8ulwYMHFzzHsfasX3/9VbfddpuqVKmi8uXLq2nTplq1alXB68YYjRgxQtWrV1f58uXVoUMHbdmyxWJi/5Sbm6vhw4erTp06Kl++vP70pz/pySefLHJvGI516Xz11Vfq2rWrkpKS5HK5NHPmzCKvF+e4HjhwQD179lRMTIzi4uJ01113KTs7u2wCmyA3ZcoUExERYd566y3z/fffm759+5q4uDizd+9e29H81rXXXmsmTpxoNmzYYNLS0sx1111natasabKzswve069fP5OcnGwWLFhgVq1aZS699FJz2WWXWUzt/1asWGFq165tmjVrZgYNGlTwPMfacw4cOGBq1apl+vTpY5YvX262bt1q5s6da3766aeC94waNcrExsaamTNnmnXr1pm//e1vpk6dOubw4cMWk/ufp556ylSpUsV89tlnZtu2bWbq1KmmYsWKZsyYMQXv4ViXzhdffGGGDRtmpk+fbiSZGTNmFHm9OMe1U6dOpnnz5mbZsmXm66+/NnXr1jU9evQok7xBX1TatGlj+vfvX/B1bm6uSUpKMqmpqRZTBZZ9+/YZSWbx4sXGGGMyMjJMeHi4mTp1asF7Nm7caCSZb7/91lZMv5aVlWXq1atn5s2bZ6644oqCosKx9qyHHnrIXH755Wd8PS8vzyQmJprnnnuu4LmMjAwTGRlpJk+e7I2IAaNLly7mzjvvLPLcDTfcYHr27GmM4Vh7yslFpTjH9YcffjCSzMqVKwveM3v2bONyucyvv/7q8YxBfern6NGjWr16tTp06FDwXEhIiDp06KBvv/3WYrLAkpmZKUmqXLmyJGn16tU6duxYkePeoEED1axZk+NeSv3791eXLl2KHFOJY+1ps2bNUqtWrfT3v/9d8fHxatGihd54442C17dt26b09PQixzs2NlZt27bleJfQZZddpgULFujHH3+UJK1bt05LlixR586dJXGsy0pxjuu3336ruLg4tWrVquA9HTp0UEhIiJYvX+7xTH59U8LztX//fuXm5iohIaHI8wkJCdq0aZOlVIElLy9PgwcPVrt27dSkSRNJUnp6uiIiIhQXF1fkvQkJCUpPT7eQ0r9NmTJFa9as0cqVK095jWPtWVu3btW4ceP0wAMP6JFHHtHKlSt13333KSIiQr179y44pqf7N4XjXTIPP/yw3G63GjRooNDQUOXm5uqpp55Sz549JYljXUaKc1zT09MVHx9f5PWwsDBVrly5TI59UBcVlL3+/ftrw4YNWrJkie0oAWnXrl0aNGiQ5s2bp3LlytmOE/Dy8vLUqlUrPf3005KkFi1aaMOGDRo/frx69+5tOV1g+eijjzRp0iR98MEHaty4sdLS0jR48GAlJSVxrINMUJ/6qVq1qkJDQ0+5AmLv3r1KTEy0lCpwDBgwQJ999pkWLVqkGjVqFDyfmJioo0ePKiMjo8j7Oe4lt3r1au3bt0+XXHKJwsLCFBYWpsWLF+ull15SWFiYEhISONYeVL16dTVq1KjIcw0bNtTOnTslqeCY8m/K+fvPf/6jhx9+WLfccouaNm2q22+/Xffff79SU1MlcazLSnGOa2Jiovbt21fk9ePHj+vAgQNlcuyDuqhERESoZcuWWrBgQcFzeXl5WrBggVJSUiwm82/GGA0YMEAzZszQwoULVadOnSKvt2zZUuHh4UWO++bNm7Vz506Oewm1b99e69evV1paWsHWqlUr9ezZs2CfY+057dq1O+VS+x9//FG1atWSJNWpU0eJiYlFjrfb7dby5cs53iV06NAhhYQU/RUVGhqqvLw8SRzrslKc45qSkqKMjAytXr264D0LFy5UXl6e2rZt6/lQHp+e62emTJliIiMjzdtvv21++OEHc/fdd5u4uDiTnp5uO5rfuueee0xsbKz58ssvzZ49ewq2Q4cOFbynX79+pmbNmmbhwoVm1apVJiUlxaSkpFhMHTgKX/VjDMfak1asWGHCwsLMU089ZbZs2WImTZpkKlSoYN5///2C94waNcrExcWZTz75xHz33XemW7duXDJbCr179zYXXHBBweXJ06dPN1WrVjUPPvhgwXs41qWTlZVl1q5da9auXWskmdGjR5u1a9eaHTt2GGOKd1w7depkWrRoYZYvX26WLFli6tWrx+XJZWns2LGmZs2aJiIiwrRp08YsW7bMdiS/Jum028SJEwvec/jwYXPvvfeaSpUqmQoVKpju3bubPXv22AsdQE4uKhxrz/r0009NkyZNTGRkpGnQoIF5/fXXi7yel5dnhg8fbhISEkxkZKRp37692bx5s6W0/svtdptBgwaZmjVrmnLlypkLL7zQDBs2zOTk5BS8h2NdOosWLTrtv9G9e/c2xhTvuP7++++mR48epmLFiiYmJsbccccdJisrq0zyuowptMwfAACADwnqOSoAAMC3UVQAAIDPoqgAAACfRVEBAAA+i6ICAAB8FkUFAAD4LIoKAADwWRQVAADgsygqAAKKy+XSzJkzbccA4CEUFQAe06dPH7lcrlO2Tp062Y4GwE+F2Q4AILB06tRJEydOLPJcZGSkpTQA/B0jKgA8KjIyUomJiUW2SpUqSXJOy4wbN06dO3dW+fLldeGFF2ratGlFvn/9+vW6+uqrVb58eVWpUkV33323srOzi7znrbfeUuPGjRUZGanq1atrwIABRV7fv3+/unfvrgoVKqhevXqaNWtW2f7QAMoMRQWAVw0fPlw33nij1q1bp549e+qWW27Rxo0bJUkHDx7Utddeq0qVKmnlypWaOnWq5s+fX6SIjBs3Tv3799fdd9+t9evXa9asWapbt26RP+Pxxx/XP/7xD3333Xe67rrr1LNnTx04cMCrPycADymTezIDCEq9e/c2oaGhJioqqsj21FNPGWOMkWT69etX5Hvatm1r7rnnHmOMMa+//rqpVKmSyc7OLnj9888/NyEhISY9Pd0YY0xSUpIZNmzYGTNIMo8++mjB19nZ2UaSmT17tsd+TgDewxwVAB511VVXady4cUWeq1y5csF+SkpKkddSUlKUlpYmSdq4caOaN2+uqKiogtfbtWunvLw8bd68WS6XS7t371b79u3PmqFZs2YF+1FRUYqJidG+fftK+yMBsIiiAsCjoqKiTjkV4ynly5cv1vvCw8OLfO1yuZSXl1cWkQCUMeaoAPCqZcuWnfJ1w4YNJUkNGzbUunXrdPDgwYLXly5dqpCQENWvX1/R0dGqXbu2FixY4NXMAOxhRAWAR+Xk5Cg9Pb3Ic2FhYapataokaerUqWrVqpUuv/xyTZo0SStWrNCbb74pSerZs6dGjhyp3r1767HHHtNvv/2mgQMH6vbbb1dCQoIk6bHHHlO/fv0UHx+vzp07KysrS0uXLtXAgQO9+4MC8AqKCgCPmjNnjqpXr17kufr162vTpk2SnCtypkyZonvvvVfVq1fX5MmT1ahRI0lShQoVNHfuXA0aNEitW7dWhQoVdOONN2r06NEFn9W7d28dOXJEL7zwgoYMGaKqVavqpptu8t4PCMCrXMYYYzsEgODgcrk0Y8YMXX/99bajAPATzFEBAAA+i6ICAAB8FnNUAHgNZ5oBlBQjKgAAwGdRVAAAgM+iqAAAAJ9FUQEAAD6LogIAAHwWRQUAAPgsigoAAPBZFBUAAOCz/j+ngi3zpAGxNwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoch = [i+1 for i in range(num_epochs)]\n",
    "plt.plot(epoch, train_loss, color='blue', label='train_loss')\n",
    "# plt.plot(epoch, test_loss, color='orange', label='test_loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7e0c1ae1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-06-06T09:50:12.411120Z",
     "start_time": "2024-06-06T09:50:12.326614Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABC2ElEQVR4nO3de3wU9b3/8fdubiSBJARNQkq4WK0QBUQQWLGt1UjE1IrEWj0pBsuRIwYqcKTIERGxggdPizeE6qGgp1Ir/sQLFZSLYoVwMYrlGmlFEoVNQJosQcht5/fHkmE3JCGEJJvMvJ6PxzySnZmd/c4QyJvPfGbGYRiGIQAAAItyBnsAAAAALYmwAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALI2wAwAALC002ANoC7xerw4ePKhOnTrJ4XAEezgAAKARDMPQsWPHlJycLKez/voNYUfSwYMHlZKSEuxhAACAJigsLFS3bt3qXU7YkdSpUydJvoMVExMT5NEAAIDG8Hg8SklJMX+P14ewI5mnrmJiYgg7AAC0M2drQaFBGQAAWBphBwAAWBphBwAAWBo9OwAAW6murlZlZWWwh4FGCAsLU0hIyHlvh7ADALAFwzDkdrtVUlIS7KHgHMTFxSkpKem87oNH2AEA2EJN0ElISFBUVBQ3kW3jDMPQd999p+LiYklS165dm7wtwg4AwPKqq6vNoNOlS5dgDweNFBkZKUkqLi5WQkJCk09p0aAMALC8mh6dqKioII8E56rmz+x8+qwIOwAA2+DUVfvTHH9mhB0AAGBphB0AAGBphB0AAFCvr776Sg6HQ9u3bw/2UJqMsGN3hiFVnQj2KAAA9bj22ms1adKkZtvemDFjNHLkyGbbXntA2LG7TVnSiiTpZHGwRwIAQIsg7Njdt1ukSo/kyQ/2SACgdRmGVHU8OJNhNGqIY8aM0YYNG/T000/L4XDI4XDoq6++0s6dOzVixAh17NhRiYmJGj16tI4cOWK+7/XXX1ffvn0VGRmpLl26KC0tTcePH9esWbP00ksv6a233jK39+GHH57zoduwYYMGDx6siIgIde3aVQ8++KCqqqrO+vmS9OGHH2rw4MGKjo5WXFychg0bpgMHDpzzGM4FNxW0O6M68CsA2EX1d9JrHYPz2beXSaHRZ13t6aef1hdffKHLL79cs2fPluR7XtTgwYP17//+75o/f75OnDihadOm6fbbb9f69et16NAh3XnnnZo3b55uvfVWHTt2TH/7299kGIYeeOAB7dmzRx6PR0uWLJEkxcfHn9PQv/nmG910000aM2aMXn75Ze3du1f33HOPOnTooFmzZjX4+VVVVRo5cqTuuece/fnPf1ZFRYW2bt3a4rcEIOzYnfdUEjeqGl4PANDqYmNjFR4erqioKCUlJUmSfvvb32rAgAGaM2eOud4f//hHpaSk6IsvvlBZWZmqqqo0atQo9ejRQ5LUt29fc93IyEiVl5eb2ztXzz//vFJSUvTcc8/J4XCod+/eOnjwoKZNm6aZM2fq0KFD9X7+0aNHVVpaqp/+9Kf6/ve/L0nq06dPk8ZxLgg7dldT0fFS2QFgMyFRvgpLsD67iT7//HN98MEH6tjxzKrUP//5Tw0fPlzXX3+9+vbtq/T0dA0fPly33XabOnfufD4jNu3Zs0culyugGjNs2DCVlZXp66+/Vv/+/ev9/Pj4eI0ZM0bp6em64YYblJaWpttvv/28nnvVGPTs2J1BZQeATTkcvlNJwZjO47RNWVmZbr75Zm3fvj1g2rdvn370ox8pJCREa9as0apVq5Samqpnn31Wl156qfbv39+MB69+Z/v8JUuWKDc3V1dffbX+8pe/6Ac/+IE2b97comMi7NgdPTsA0KaFh4eruvr0v9FXXnmldu3apZ49e+riiy8OmKKjfX1ADodDw4YN06OPPqrPPvtM4eHhWrFiRZ3bO1d9+vRRbm6uDL8m640bN6pTp07q1q3bWT9fkgYMGKDp06dr06ZNuvzyy7Vs2bImj6cxCDt2R88OALRpPXv21JYtW/TVV1/pyJEjysnJ0dGjR3XnnXdq27Zt+uc//6n33ntPd999t6qrq7VlyxbNmTNHn3zyiQoKCvTGG2/o8OHDZm9Mz5499fe//135+fk6cuTIOT9g87777lNhYaEmTpyovXv36q233tIjjzyiKVOmyOl0Nvj5+/fv1/Tp05Wbm6sDBw7o/fff1759+1q8b4eeHbujsgMAbdoDDzyg7Oxspaam6sSJE9q/f782btyoadOmafjw4SovL1ePHj104403yul0KiYmRh999JGeeuopeTwe9ejRQ7/73e80YsQISdI999yjDz/8UIMGDVJZWZk++OADXXvttY0ez/e+9z29++67mjp1qvr376/4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ALA0wk4zWbBggXr27KkOHTpoyJAh2rp1a7CH1O7NnTtXV111lTp16qSEhASNHDlS+fn5AeucPHlSOTk56tKlizp27KjMzEwVFRUFacTW8cQTT8jhcGjSpEnmPI518/nmm2/0y1/+Ul26dFFkZKT69u2rTz75xFxuGIZmzpyprl27KjIyUmlpadq3b18QR9w+VVdX6+GHH1avXr0UGRmp73//+3rssccCnqPEsW6ajz76SDfffLOSk5PlcDj05ptvBixvzHE9evSosrKyFBMTo7i4OI0dO1ZlZWUtM2AD5+3VV181wsPDjT/+8Y/Grl27jHvuuceIi4szioqKgj20di09Pd1YsmSJsXPnTmP79u3GTTfdZHTv3t0oKysz17n33nuNlJQUY926dcYnn3xiDB061Lj66quDOOr2b+vWrUbPnj2Nfv36Gffff785n2PdPI4ePWr06NHDGDNmjLFlyxbjyy+/NN577z3jH//4h7nOE088YcTGxhpvvvmm8fnnnxs/+9nPjF69ehknTpwI4sjbn8cff9zo0qWLsXLlSmP//v3G8uXLjY4dOxpPP/20uQ7Humneffdd46GHHjLeeOMNQ5KxYsWKgOWNOa433nij0b9/f2Pz5s3G3/72N+Piiy827rzzzhYZL2GnGQwePNjIyckxX1dXVxvJycnG3Llzgzgq6ykuLjYkGRs2bDAMwzBKSkqMsLAwY/ny5eY6e/bsMSQZubm5wRpmu3bs2DHjkksuMdasWWP8+Mc/NsMOx7r5TJs2zbjmmmvqXe71eo2kpCTjySefNOeVlJQYERERxp///OfWGKJlZGRkGL/61a8C5o0aNcrIysoyDINj3Vxqh53GHNfdu3cbkoxt27aZ66xatcpwOBzGN9980+xj5DTWeaqoqFBeXp7S0tLMeU6nU2lpacrNzQ3iyKyntLRUkhQfHy9JysvLU2VlZcCx7927t7p3786xb6KcnBxlZGQEHFOJY92c3n77bQ0aNEg///nPlZCQoAEDBujFF180l+/fv19utzvgWMfGxmrIkCEc63N09dVXa926dfriiy8kSZ9//rk+/vhjjRgxQhLHuqU05rjm5uYqLi5OgwYNMtdJS0uT0+nUli1bmn1MPAj0PB05ckTV1dVKTEwMmJ+YmKi9e/cGaVTW4/V6NWnSJA0bNkyXX365JMntdis8PFxxcXEB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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoch = [i+1 for i in range(num_epochs)]\n",
    "# plt.plot(epoch, train_loss, color='blue', label='train_loss')\n",
    "plt.plot(epoch, test_loss, color='orange', label='test_loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "cnn",
   "language": "python",
   "name": "cnn"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.19"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
